Winform中設置ZedGraph當前全部曲線的顏色

場景

Winforn中設置ZedGraph曲線圖的屬性、座標軸屬性、刻度屬性:編程

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100112573工具

當ZedGraph的圖形渲染完成後,添加設置全部曲線顏色功能。ui

注:this

博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關注公衆號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。spa

實現

首先在ZedGraph的右鍵菜單中添加設置曲線顏色選項,在面板初始化的方法中訂閱右鍵事件。.net

zgc.ContextMenuBuilder -= zgc_ContextMenuBuilder;     //上下文菜單生成事件訂閱
zgc.ContextMenuBuilder += zgc_ContextMenuBuilder;     //上下文菜單生成事件訂閱

而後在訂閱的方法中code

private static void zgc_ContextMenuBuilder(ZedGraphControl control, ContextMenuStrip menuStrip, Point mousePt, ZedGraphControl.ContextMenuObjectState objState)
        {
            #region 擴展上下文菜單

            #region 圖形選項菜單

            ToolStripMenuItem mnuChartOption = new ToolStripMenuItem();     //新建菜單項對象
            mnuChartOption.Name = "set_curve_color";
            mnuChartOption.Text = "設置曲線顏色";
            //點擊彈出圖形選項對話框
            mnuChartOption.Click += delegate(object sender, EventArgs e)
            {
                if (curveModelList == null || curveModelList.Count == 0)
                {
                    XtraMessageBox.Show("當前沒有曲線");
                }
                else
                {
                    FrmSetCurveColor setCurveColor = new FrmSetCurveColor();
                    DialogResult result = setCurveColor.ShowDialog();                               //顯示Dialog
                    if (result == DialogResult.OK)
                    {
                        TriggerSetCurveColor();
                        XtraMessageBox.Show("設置曲線顏色成功");
                    }
                }
            };
            menuStrip.Items.Add(mnuChartOption);        //把圖形選項對話框添加到上下文菜單中

             #endregion

 

             #endregion

 

            #region 漢化上下文菜單中的菜單項

            foreach (ToolStripMenuItem item in menuStrip.Items)
            {
                switch (item.Name)
                {
                    case "copied_to_clip":
                        item.Text = @"複製到剪貼板";
                        break;
                    case "copy":
                        item.Text = @"複製";
                        break;
                    case "page_setup":
                        item.Text = @"頁面設置...";
                        break;
                    case "print":
                        item.Text = @"打印...";
                        break;
                    case "save_as":
                        item.Text = @"另存圖表...";
                        break;
                    case "set_default":
                        item.Text = @"恢復默認大小";
                        break;
                    case "show_val":
                        item.Text = @"顯示節點數值";
                        break;
                    case "title_def":
                        item.Text = @"標題";
                        break;
                    case "undo_all":
                        item.Text = @"還原全部縮放";
                        break;
                    case "unpan":
                        item.Text = @"還原上一步縮放";
                        break;
                    case "unzoom":
                        item.Text = @"還原縮放";
                        break;
                    case "set_curve_color":
                        item.Text = @"設置曲線顏色";
                        break;
                }

             }

            #endregion

         }

 

 此時會漢化右鍵菜單並添加右鍵選項,而且其點擊事件是打開設置曲線顏色面板。orm

 在設置曲線顏色面板的代碼中,在其load方法中調用初始化面板的方法,對象

  此時要根據傳遞的曲線的Model的list去生成當前已有曲線的設置的panel。blog

  那麼當前已經有多少個曲線是如何傳遞的?

  在前面ZedGraph生成曲線的地方所在的工具類中聲明一個全局的list

 

public static List<CurveModel> curveModelList= new List<CurveModel>();

其中CurveModel是自定義的存取曲線屬性的Model類

 public class CurveModel 
    {
        /// <summary>
        /// 曲線序號
        /// </summary>
        private int curveIndex;

        public int CurveIndex
        {
            get { return curveIndex; }
            set { curveIndex = value; }

         }

        /// <summary>
        /// 源文件
        /// </summary>
        private string originFile;

        public string OriginFile
        {
            get { return originFile; }
            set { originFile = value; }

         }

        /// <summary>
        /// 源文件完整路徑
        /// </summary>
        private string originFileFullPath;

        public string OriginFileFullPath
        {
            get { return originFileFullPath; }
            set { originFileFullPath = value; }

         }

        /// <summary>
        /// 屬性名
        /// </summary>
        private string attributeName;

        public string AttributeName
        {
            get { return attributeName; }
            set { attributeName = value; }

         }

        /// <summary>
        /// 顏色
        /// </summary>
        private string color;
        
        public string Color
        {
            get { return color; }
            set { color = value; }
        }

     }

 

聲明完list後,其中生成曲線的地方也在這個工具類中

 

curveModelList.Clear();

 

 int curveIndex = 0;
                for (int k = 0; k < compTestDataList.Count; k++)
                {
                    //循環添加曲線
                    for (int i = 0; i < yList.Count; i++)
                    {
                        SymbolType symbolType = GetCurveSimple(yList[i].CurveType);                                //根據配置文件中曲線符號類型返回曲線符號標識
                        list = SetCurveText(interval, xAttribute.TitleKey, yList[i].TitleKey, compTestDataList[k]);
                        LineItem myCurve = myPane.AddCurve(yList[i].Title, list, System.Drawing.ColorTranslator.FromHtml(yList[i].Color), symbolType);
                        myCurve = SetCurveType(myCurve,symbolType, yList[i].Type, yList[i].Color);                         //根據配置文件設置曲線類型
                        myCurve.YAxisIndex = i;                                                                 //很關鍵,對應使用那個座標值
                        CurveModel curveModel = new CurveModel();
                        string originFile = compTestDataList[k].ThisDataFile;
                        curveModel.OriginFile = originFile.Substring(originFile.LastIndexOf("\\") + 1);
                        curveModel.CurveIndex = curveIndex;
                        curveModel.OriginFileFullPath = originFile;
                        curveModel.AttributeName = yList[i].Title;
                        curveModel.Color = yList[i].Color;
                        curveModelList.Add(curveModel);
                        curveIndex++;
                    }
                }

 

這樣在生成曲線時就將當前圖形的全部曲線的屬性存到一個工具類中全局的一個list中,而後在設置曲線顏色面板中獲取這個list。

 

private void FrmSetCurveColor_Load(object sender, EventArgs e)
       {
             curveModelList.Clear();
             curveModelList = ChartCompareHelper.curveModelList;
             initSetCurveColorPane(curveModelList);

        }

 

而後在使用這個list去初始化設置顏色的面板

 

private void initSetCurveColorPane(List<CurveModel> curveModelList)
        {
            int panelControlHeight = 20;
            int panelControlWidth = 50;
            foreach(CurveModel curve in curveModelList)
            {
                PanelControl panelControl = new PanelControl();
                #region 生成一個Label標識X軸
                //生成一個Label標識X軸
                LabelControl label = new LabelControl();
                label.Text = "" + (curve.CurveIndex + 1).ToString() + "條曲線(" + curve.OriginFile + "" + curve.AttributeName + ")的顏色爲:";
                label.Location = new Point(Global.NOGROUP_HORIZONTAL_DISTANCE, Global.GROUP_VERTICAL_DISTANCE);
                label.Parent = panelControl;
                #endregion


                #region 生成一個顏色選擇器

                //添加顏色選擇器
                ColorEdit colorEditX = new ColorEdit();
                colorEditX.Text = curve.Color;
                colorEditX.Width = Global.CHART_OPTION_WIDTH;
                colorEditX.Location = new Point(Global.NOGROUP_HORIZONTAL_DISTANCE * 2 + label.Width, Global.GROUP_VERTICAL_DISTANCE);
                colorEditX.Parent = panelControl;
                colorEditX.Name = "colorEdit"+curve.CurveIndex;

                #endregion


                #region 設置X軸Panel的位置以及屬性

                
                //設置panel的寬度
                panelControl.Width = label.Width + colorEditX.Width + Global.NOGROUP_HORIZONTAL_DISTANCE * 3;
                //設置panel的高度
                panelControl.Height = label.Height + Global.GROUP_VERTICAL_DISTANCE * 2;
                panelControlHeight = panelControl.Height;
                panelControlWidth = panelControl.Width;
                //設置panel的位置
                panelControl.Location = new Point(Global.NOGROUP_HORIZONTAL_DISTANCE, (panelControl.Height * curve.CurveIndex) + (Global.GROUP_VERTICAL_DISTANCE *(curve.CurveIndex + 1)));
                //設置Name
                panelControl.Name = "panelControl" + curve.CurveIndex;
                //將panel添加到當前窗體
                this.Controls.Add(panelControl);

                #endregion
            }

            this.Width = panelControlWidth + Global.NOGROUP_HORIZONTAL_DISTANCE * 4;

            this.Height = (curveModelList.Count + 1) * panelControlHeight + (curveModelList.Count + 2) * Global.GROUP_VERTICAL_DISTANCE + +this.panelControl1.Height;
        }

 

而後設置顏色後,點擊保存後在肯定按鈕的點擊事件中

 private void simpleButton2_Click_1(object sender, EventArgs e)
        {
            for (int i = 0; i < curveModelList.Count; i++)
            {
                ColorEdit colorEditY = this.Controls.Find("colorEdit" + i, true)[0] as ColorEdit;
                curveModelList[i].Color = colorEditY.Text;
            }


            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }

 

再將設置的顏色屬性賦值給當前設置顏色面板做用域的list

List<CurveModel> curveModelList = new List<CurveModel>();

此時窗體返回OK,再回到右鍵打開窗口的地方

 

if (result == DialogResult.OK)
                    {
                        TriggerSetCurveColor();
                        XtraMessageBox.Show("設置曲線顏色成功");
                    }

此時會觸發設置曲線顏色的方法

 public static void TriggerSetCurveColor()
        {
            if (OnSetCurveColor != null)
            {
                OnSetCurveColor(null, System.EventArgs.Empty);
            }

         }

 

此事件聲明

public static event EventHandler OnSetCurveColor;

 

 事件會在圖形所在的頁面進行訂閱

 

ChartCompareHelper.OnSetCurveColor + = ChartCompareHelper_OnSetCurveColor;

 

訂閱執行的方法

private void ChartCompareHelper_OnSetCurveColor(object sender, EventArgs e)
        {
            ChartCompareHelper.SetCurveColor(this.zedGraphControl1);

          }

 

此方法傳遞當前ZedGraph對象

 

 public static void SetCurveColor(ZedGraphControl zedGraphControl)
        {
            for (int i = 0; i < curveModelList.Count;i++)
            {
                zedGraphControl.GraphPane.CurveList[i].Color = System.Drawing.ColorTranslator.FromHtml(curveModelList[i].Color);
            }
            
            zedGraphControl.GraphPane.AxisChange();
            zedGraphControl.Refresh();

             zedGraphControl.Invalidate();

      }

而後按順序設置曲線顏色。 

相關文章
相關標籤/搜索