wpf使用Chart控件绘制线图

​ 最近再项目中,突然用到了绘图的功能,虽然只是将用户数据简单的展示出来,但是介于之前从来没有用过wpf的原生控件绘图,所以就先再网上找了demo,尝试了一下,这里当作记录。

​ 测试程序运行结果如下:

绘图结果

​ 电脑上安装的是vs2019,没有在控件里面看到Chart,发现要添加两个引用

添加dll列表
添加后,就可以开始wpf界面代码添加了,具体代码如下:

<Window x:Class="DrawingView.GraphView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:Chr="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization"
        xmlns:local="clr-namespace:DrawingView"
        mc:Ignorable="d"
        Title="GraphView" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="40"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0">
            <Button Content="初始化" x:Name="InitBtn" Click="InitBtn_Click" Width="80" Height="18" Margin="10,0"/>
            <Button Content="开始" x:Name="StartBtn" Click="StartBtn_Click" Width="80" Height="18" Margin="10,0"/>
        </StackPanel>

        <Border Grid.Row="1" BorderThickness="2" BorderBrush="LightGray" Margin="10" CornerRadius="5">
            <wfi:WindowsFormsHost>
                <Chr:Chart x:Name="chart1"/>
            </wfi:WindowsFormsHost>
        </Border>
    </Grid>
</Window>

最主要的代码是这里,先添加两个引用,然后再xaml中添加一个容器,最后把chart控件放到容器中:

<wfi:WindowsFormsHost>
	<Chr:Chart x:Name="chart1"/>
</wfi:WindowsFormsHost>

接下来看看后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Forms.DataVisualization.Charting;

namespace DrawingView
{
    /// <summary>
    /// GraphView.xaml 的交互逻辑
    /// </summary>
    public partial class GraphView : Window
    {
        private Queue<double> dataQueue = new Queue<double>(100);

        private Queue<double> dataQueueSin = new Queue<double>(100);

        public GraphView()
        {
            InitializeComponent();
        }

        private void InitBtn_Click(object sender, RoutedEventArgs e)
        {
            InitChart();
        }

        private void StartBtn_Click(object sender, RoutedEventArgs e)
        {
            UpdateQueueValue();
            this.chart1.Series[0].Points.Clear();
            for (int i = 0; i < dataQueue.Count; i++)
            {
                this.chart1.Series[0].Points.AddXY((i + 1), dataQueue.ElementAt(i));
            }
            this.chart1.Series[1].Points.Clear();
            for (int i = 0; i < dataQueueSin.Count; i++)
            {
                this.chart1.Series[1].Points.AddXY((i + 1), dataQueueSin.ElementAt(i));
            }
        }

        private void UpdateQueueValue()
        {
            Random r = new Random();
            for (int i = 0; i < 100; i++)
            {
                //对象添加到 System.Collections.Generic.Queue<T> 的结尾处。
                dataQueue.Enqueue(r.Next(0, 100));
            }

            int curValue = 0;
            for (int i = 0; i < 100; i++)
            {
                curValue = curValue % 360;
                dataQueueSin.Enqueue(50 * Math.Sin(curValue * Math.PI / 180) + 50);
                curValue += 10;
            }
        }

        private void InitChart()
        {
            //定义图标区域
            this.chart1.ChartAreas.Clear();
            ChartArea chartArea1 = new ChartArea("C1");
            this.chart1.ChartAreas.Add(chartArea1);

            ChartArea chartArea2 = new ChartArea("C2");
            this.chart1.ChartAreas.Add(chartArea2);

            //定义储存和显示点的容器
            this.chart1.Series.Clear();
            Series series1 = new Series("S1");
            series1.ChartArea = "C1";
            this.chart1.Series.Add(series1);

            Series series2 = new Series("S2");
            series2.ChartArea = "C2";
            this.chart1.Series.Add(series2);

            //设置图标显示样式
            foreach(var item in this.chart1.ChartAreas)
            {
                item.AxisX.Minimum = 0;
                item.AxisX.Maximum = 100;
                item.AxisX.Interval = 5;
                item.AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
                item.AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
            }
            //设置标题
            this.chart1.Titles.Clear();
            this.chart1.Titles.Add("S1");
            this.chart1.Titles[0].Text = "图形绘制展示";
            this.chart1.Titles[0].ForeColor = System.Drawing.Color.RoyalBlue;
            this.chart1.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
            //设置图标显示样式
            this.chart1.Series[0].Color = System.Drawing.Color.Red;
            this.chart1.Series[1].Color = System.Drawing.Color.Red;

            this.chart1.Series[0].ChartType = SeriesChartType.Line;

            this.chart1.Series[1].ChartType = SeriesChartType.Spline;

            this.chart1.Series[0].Points.Clear();

            // 清除dataQueue中所有数据
            dataQueue.Clear();
            dataQueueSin.Clear();
        }
    }
}

dataQueuedataQueueSin是用来存放绘图点的(y数据点),一个是随机数,一个是正/余弦波。在代码中,主要就是利用chart控件的集合属性画图,最主要的三个属性ChartAreas、Series、Legends,在这里我没有用到Legends,但是可以再我推荐的博客里面看到使用和详解。

  1. ChartAreas属性:ChartAreas可以理解为是一个图表的绘图区,图表控件并不限制你添加多少个绘图区域,你可以根据你的需要进行添加,对于每个绘图区域,都可以设置独立的属性,如:X,Y轴属性、背景等。但是他只开辟了一个可作图的空间,并不包含要作图的数据。
  2. Series属性:图表集合,就是最终看到的饼图、柱状图、线图、点图等构成数据的集合。每个Series属性,可以给他指定到特定的绘图区中。
  3. Legends属性:MSChart的图例默认不显示,可以通过属性配置实现展示。

​ chart控件的基本信息,可以参考下面这篇博客:

​ https://blog.csdn.net/qq_27825451/article/details/81305387

​ chart控件可以绘制的其他图形基本教程,可以参考下面这篇博客:

​ https://www.cnblogs.com/mazhenyu/p/9498439.html

​ 然后还看了一篇总结:

​ https://blog.csdn.net/daisy0923/article/details/73325681

​ 上面的这三个博客供参考,具体的还是要自己动手尝试才行。

之前三此发的库http://download.csdn.net/detail/maiker/9621027可以作废,本次为最新的,其中测试了历史曲线的动态显示,这是对Microsoft WpfToolkit的更新和扩展: 1、将库版本升级到.NET 4.6.1,对命名控件进行了替换处理 2、实现了单数据Chart图的混合颜色显示,可通过修改资源字典调整和添加颜色 3、可控制各种Chart图形的数据值显示 4、坐标轴文本可倾斜显示 5、添加了StepLine图和圆环图,圆环半径比例系数可设定,同时添加了饼图的半径比系数,这样可以更好的控制饼图的标签显示,避免重叠 6、Legend可位于区域四侧,对齐方式也可以设定,以及是否显示, 可控制Chart Title是否显示 7、柱状图缝隙间隔可调整 8、全方面的加入了各种加载动画效果,动画效果可屏蔽,同时原系统自带动画效果,可叠加,这是两种不同的效果,可以互补性的单个使用 9、设计了四种主题颜色,各人可以针对图形颜色和背景色进行更好的搭配,在用户项目中,可以自己添加新的主题。 10、扩展了时间轴的应用,在新的DateTimeChart中可以通过鼠标平移和缩放时间轴,并测试了两个例子用于动态显示历史曲线,一个是外部定时更新,一个是内部定时更新 11、对LineDataPoint样式进行了设计,现在可以选择线图的点样式(如空心圆、五角星、三角形,矩形等),同时这些不同的点样式可以体现在Legend上,从而实现颜色和图形的双重区分。 总而言之,微软的控件库做得很标准,还是很好修改的。 最后一直想在历史曲线中取消点动画(及默认的透明度动画),以便提高执行效率,但微软的那部分动画不熟,总是修改失败。 可以发邮件wuyang26@live.cn讨论。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值