栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

在WPF中使用Winform中自带的画图控件Chart,模拟动态更新数据

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在WPF中使用Winform中自带的画图控件Chart,模拟动态更新数据

一、如何在WPF中使用Chart控件 1、添加引用

右键项目引用-添加引用,在程序集中选择下图三个东东

2、添加命名空间
xmlns:Wchart="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization"
3、引用

注意要放在WindowsFormsHost标签内部


	

二、代码

先上最终的效果图,如下图,可选择图中显示的点数,以及更新速度。

1、布局设计

    
        
        
    
    
        
            
            
        
        
            
            
        
        

rabtn是自定义的一个RadioButton样式资源文件,感兴趣的可以看看(不看也没影响)


2、逻辑实现
public partial class MainWindow : Window
{
    private ChartArea AREA = new ChartArea() { Name = "Line" };             // 画图区域
    private Series SERIES = new Series();                                   // 一条折线
    private Legend LEGEND = new Legend();                                   // 一个图例
    private System.Timers.Timer timer = new System.Timers.Timer();          // 定时器
    private int INTERVAL = 500;                                             // 定时器时间
    private int MAXPLOT = 100;                                              // 图中最多点数
    
    public MainWindow()
    {
        InitializeComponent();

        // area样式设置
        AREA.AxisX.Enabled = AxisEnabled.True;                  // 使X轴可用
        AREA.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;   // X 轴标签数量,由显示的数据点数量自动调整
        AREA.AxisY.Enabled = AxisEnabled.True;
        AREA.AxisY.MajorTickMark.Enabled = false;
        AREA.CursorX.IsUserSelectionEnabled = true;             // 鼠标选择区域放大

        // series设置
        SERIES.ChartArea = "Line";
        SERIES.ChartType = SeriesChartType.Line;                // 折线图
        SERIES.Name = "随机数";
        SERIES.ToolTip = "数值:n#VALY";                      // 鼠标悬浮在点上面显示提示(不够灵敏)

        // legend设置
        LEGEND.Alignment = System.Drawing.StringAlignment.Near;         // legend靠近显示,不然太占用地方了
        LEGEND.Docking = Docking.Left;                                  // 靠左显示
        LEGEND.DockedToChartArea = "Line";                              // 默认图例是显示在图的外面,占用地方
        LEGEND.IsDockedInsideChartArea = true;                          // 将图例放在图里面
        LEGEND.BackColor = System.Drawing.Color.Transparent;            // 无背景色,不然会挡住折线

        // 添加area series legend
        ChartPlot.ChartAreas.Add(AREA);
        ChartPlot.Series.Add(SERIES);
        ChartPlot.Legends.Add(LEGEND);

        // timer设置
        timer.Enabled = false;
        timer.Interval = INTERVAL;
        timer.Elapsed += Timer_Elapsed;
    }
    /// 
    /// 定时更新图
    /// 
    /// 
    /// 
    private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Application.Current.Dispatcher.Invoke(() =>
        {
            if (SERIES.Points.Count >= MAXPLOT)
            {
                for(int i = 0; i < SERIES.Points.Count - MAXPLOT - 1; i++)
                {
                    SERIES.Points.RemoveAt(0);
                }
            }
            SERIES.Points.AddXY(DateTime.Now.ToString("HH:mm:ss"), GetRandomNumber());
            // 刷新图
            AREA.RecalculateAxesScale();
        });
    }
    /// 
    /// 开始、暂停 画图
    /// 
    /// 
    /// 
    private void btn_start_Click(object sender, RoutedEventArgs e)
    {
        if (timer.Enabled)
        {
            timer.Enabled = false;
            btn_start.Content = "开始";
        }
        else
        {
            timer.Enabled = true;
            btn_start.Content = "暂停";
        }
    }
    /// 
    /// 改变间隔时间
    /// 
    /// 
    /// 
    private void rbtn_highspeed_Click(object sender, RoutedEventArgs e)
    {
        timer.Interval = 100;
    }
    private void rbtn_lowspeed_Click(object sender, RoutedEventArgs e)
    {
        timer.Interval = 500;
    }
    /// 
    /// 改变图中最多点数
    /// 
    /// 
    /// 
    private void rbtn_manypoint_Click(object sender, RoutedEventArgs e)
    {
        MAXPLOT = 50;
    }
    private void rbtn_littlepoint_Click(object sender, RoutedEventArgs e)
    {
        MAXPLOT = 20;            
    }
    /// 
    /// 产生随机数
    /// 
    /// 
    private int GetRandomNumber()
    {
        byte[] buffer = Guid.NewGuid().ToByteArray(); 
        int iSeed = BitConverter.ToInt32(buffer, 0); 
        Random random = new Random(iSeed);
        return random.Next(-100, 100);
    }
}
3、最后

动态效果图来啦!!!!!!!!!

写在最后:最近做wpf一个项目,需要画图。可惜wpf没有自带的画图控件,而查询了很多了第三方控件(OxyPlot、Visifire、Dynamic Data Display)并尝试用了一下,唔,好难啊,主要是资料好少,还是winform的chart用的舒服。在此做个记录,以后用到的话也方便。

有问题欢迎交流。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号