LIBS(1-数据的展示)

LIBS-数据的展示

libs中需要将数据给展示出来,

一开始打算自己写一个数据绘制的控件,参考了b站的视频WPF 图表控件库 WindChart 3_哔哩哔哩_bilibili

但在此遇到一个问题,在计算像素比的时候RenderSize这个属性在一些情况下为0,也始终找不到方法规避,于是换了微软的chart框架。同时找了篇文章做参考

Chart 类 (System.Windows.Forms.DataVisualization.Charting) | Microsoft Learn

WPF调用Winform Chart控件绘图 - StackMiao - 博客园 (cnblogs.com)

通过以上这两个资料,我们可以得出,在WPF中使用此框架绘制,需要在容器绘制,而绘制需要注意3个类,

  1. Series:控制绘图的类型和数据的注入
  2. ChartAreas :控制XY轴的样式
  3. Legends :图表图像的图例

将这三个类初始画赋值,添加到容器中就可以完成图标的绘制。

1.框架的引入

在程序集中添加

  • System.Windows.Forms;
  • System.Windows,Forms.DataVisualization;
  • WindowsFormsIntefration;

2.容器的添加

在XMAL中添加命名空间

  xmlns:Wchart="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization" 

引入容器,给容器一个名字

<WindowsFormsHost>
    <Wchart:Chart x:Name="ChartPlot"/>
 </WindowsFormsHost>

3.3种类的初始化和赋值

  1. 初始化三个类ChartArea,Series,Legend,我是为了方便调用,设置为了类的属性
  2. 对其的属性根据需要赋值。具体属性所代表的意义可以看微软官方文档
  3. 在容器中注入值,一个容器中可以注入多个Series类,所以在一个容器中可以显示多张图表。
public class OneChart
    {
        public OneChart()
        {
            chartAreaLine = new ChartArea();
            series = new Series();
            legend = new Legend();
            xYpointList = new List<XYpoint>();

            Init();

        }
      

        public ChartArea chartAreaLine { get; set; }
        public Series series { get; set; }
        public Legend legend { get; set; }
     

        private List<XYpoint> xYpointList;

        public List<XYpoint> XYpointList
        {
            get { return xYpointList; }
            set { xYpointList = value; DataChanged(); }
        }

        public string xTitle { get; set; } = "X轴";

        public string yTitle { get; set; } = "Y轴";

        public string LineTitle { get; set; } = "线条1";


        private void Init()
        {
            chartAreaLine.AxisX.Title = xTitle;
            chartAreaLine.AxisX.TitleAlignment = System.Drawing.StringAlignment.Far; // 标题对其方式

            chartAreaLine.AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount; // 间隔的模式
            //chartAreaLine.AxisX.Interval = 2; // 轴的间隔
            chartAreaLine.AxisX.IntervalType = DateTimeIntervalType.Auto; // 轴的间隔单位类型,默认为auto

            chartAreaLine.AxisX.Minimum = 0; // 轴的起始点,最小值

            chartAreaLine.AxisX.ArrowStyle = AxisArrowStyle.Lines; // 箭头
            chartAreaLine.AxisX.MajorGrid.Enabled = false;  // 是否启用网格线

            chartAreaLine.AxisY.Title = yTitle;
            chartAreaLine.AxisY.IntervalType = DateTimeIntervalType.Auto;
            chartAreaLine.AxisY.ArrowStyle = AxisArrowStyle.Lines; // 箭头
            chartAreaLine.AxisY.TitleAlignment = System.Drawing.StringAlignment.Far;


            series.ChartType = SeriesChartType.Line; // 绘图类型
            series.Color = System.Drawing.Color.Red;
            series.Name = LineTitle;

            legend.Alignment = System.Drawing.StringAlignment.Near;
            legend.Docking = Docking.Right;
            legend.IsDockedInsideChartArea = true;
            legend.BackColor = System.Drawing.Color.Transparent;
   
        }

        public void DataChanged()
        {
            series.Points.Clear();
            foreach (var item in xYpointList)
            {
                series.Points.AddXY(item.X, item.Y);
            }
        }
    }

    public class XYpoint
    {
        public XYpoint(double x, double y)
        {
            X = x;
            Y = y;
        }
        public double X { get; set; }
        public double Y { get; set; }
    }

 public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            // 1.通过引用dll文件编写方法获取机器数据
           // GetData();

            // 2.处理数据
           // DealData();

            // 3.展示数据
            DisPlayData();

        }

        #region 成员变量


        // 初始化图标
        OneChart oneChart = new OneChart();
        #endregion

        #region 方法
        /// <summary>
        /// 展示数据
        /// </summary>
        public void DisPlayData()
        {
           
            // 给数据
            Random random = new Random();
            List<XYpoint> xYpoints = new List<XYpoint>();
            for (int i = 0; i < 500; i++)
            {
                xYpoints.Add(new XYpoint(i, random.Next(10, 40)));
            }
            oneChart.XYpointList = xYpoints;
          

            // 关联
            ChartPlot.Series.Add(oneChart.series);        
            ChartPlot.ChartAreas.Add(oneChart.chartAreaLine);
            ChartPlot.Legends.Add(oneChart.legend);
        }

        #endregion
       
        public void ChangeDateRandom()
        {
            this.Dispatcher.Invoke(() =>
            {
               
                Random random = new Random();
                List<XYpoint> xYpoints = new List<XYpoint>();
                for (int i = 0; i < 500; i++)
                {
                    xYpoints.Add(new XYpoint(i, random.Next(10, 40)));
                }
                oneChart.XYpointList = xYpoints;
               
            });
        }
    }

最后做出来的效果如图

posted @ 2022-12-15 16:28  阿狸的萝卜  阅读(70)  评论(0编辑  收藏  举报