WPF调用Winform Chart控件绘图

最近在研究WPF,需要用到类似Chart的控件来绘制折线图,横坐标自定义时间信息。先后研究了DynamicDataDisplay.ChartPlotter、Toolkit,因为WPF用的人太少了,这方面可以查到的资料太少了。DynamicDataDisplay.ChartPlotter虽然能实现横坐标显示时间,但是我想显示的是历史的时间信息,非当下时间,遂弃之。如果有知道的大神,可以提点下我怎么改。

以上种种,导致我想用熟悉的Winform下的Chart来绘制。

1.首先添加引用

System.Windows.Forms.dll

WindowsFormsIntegration.dll

System.Windows.Forms.DataVisualization.dll

2..xaml添加命名空间

    xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    xmlns:Chr="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization"

3.WPF是不可以直接引用WinForm Chart,但可以托管在WindowsFormsHost中使用,所以我们要添加一个宿主容器。

     <WindowsFormsHost x:Name="WFHost_HistoryFlow" Margin="1">
         <Chr:Chart x:Name="Chart_HistoryFlow" GetToolTipText="Chart_HistoryFlow_GetToolTipText" BackColor="WhiteSmoke" MouseWheel="Chart_HistoryFlow_MouseWheel"/>
     </WindowsFormsHost>

4.后台代码.cs添加命名空间

using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

5.后台代码

 5.1私有变量

      DataTable dataTable = new DataTable();

 5.2 初始化

 /// <summary>
        /// 設定Chart Control
        /// </summary>
        private void SetChart()
        {
            ChartArea ca = new ChartArea("ChartArea1");
            this.Chart_HistoryFlow.ChartAreas.Add(ca);
            ChartArea ca_Pres = new ChartArea("ChartArea1");
            this.Chart_HistoryPres.ChartAreas.Add(ca_Pres);
            ChartArea ca_Ratio = new ChartArea("ChartArea1");
            this.Chart_HistoryRatio.ChartAreas.Add(ca_Ratio);

            //Processor
            System.Windows.Forms.DataVisualization.Charting.Legend lgFlow = new System.Windows.Forms.DataVisualization.Charting.Legend("Legend1");
            lgFlow.IsTextAutoFit = true;
            lgFlow.Docking = Docking.Top;
            this.Chart_HistoryFlow.Legends.Add(lgFlow);

            System.Windows.Forms.DataVisualization.Charting.Legend lgPres = new System.Windows.Forms.DataVisualization.Charting.Legend("Legend1");
            lgPres.IsTextAutoFit = true;
            lgPres.Docking = Docking.Top;
            this.Chart_HistoryPres.Legends.Add(lgPres);

            System.Windows.Forms.DataVisualization.Charting.Legend lgRatio = new System.Windows.Forms.DataVisualization.Charting.Legend("Legend1");
            lgRatio.IsTextAutoFit = true;
            lgRatio.Docking = Docking.Top;
            this.Chart_HistoryRatio.Legends.Add(lgRatio);

            SetChartAutoBar(Chart_HistoryFlow);
            SetChartAutoBar(Chart_HistoryPres);
            SetChartAutoBar(Chart_HistoryRatio);
        }

        /// <summary>
        /// 设置折线图游标
        /// </summary>
        private void SetChartAutoBar(Chart chart)
        {
            //设置游标
            chart.ChartAreas[0].CursorX.IsUserEnabled = true;
            chart.ChartAreas[0].CursorX.AutoScroll = true;
            chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
            //设置X轴是否可以缩放
            chart.ChartAreas[0].AxisX.ScaleView.Zoomable = true;

            //将滚动内嵌到坐标轴中
            chart.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true;
            // 设置滚动条的大小
            chart.ChartAreas[0].AxisX.ScrollBar.Size = 10;
            // 设置滚动条的按钮的风格,下面代码是将所有滚动条上的按钮都显示出来
            chart.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.All;
            // 设置自动放大与缩小的最小量
            chart.ChartAreas[0].AxisX.ScaleView.SmallScrollSize = double.NaN;
            chart.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSize = 1;
        }    

 5.3 事件

        /// <summary>
        /// 历史流量折线图鼠标滚动 滚动条对应滑动 最小及最大数据位置停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Chart_HistoryFlow_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
        {

            //按住Ctrl,缩放
            if ((System.Windows.Forms.Control.ModifierKeys & Keys.Control) == Keys.Control)
            {
                if (e.Delta < 0)
                    Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.Size += 4;
                else
                    Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.Size -= 4;
            }
            //不按Ctrl,滚动
            else
            {
                if (e.Delta < 0)
                {
                    //当前位置+视图长大于最大数据时停止
                    if (Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.Position + Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.Size < Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.ViewMaximum)
                        Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.Position += 4;
                }
                else
                {
                    //当前位置小于最小数据时停止
                    if (Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.Position > Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.ViewMinimum)
                        Chart_HistoryFlow.ChartAreas[0].AxisX.ScaleView.Position -= 4;
                }

            }
        }

        /// <summary>
        /// 流量脉冲折线图光标显示详细数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Chart_HistoryFlow_GetToolTipText(object sender, System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs e)
        {
            if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint)
            {
                this.Cursor = System.Windows.Input.Cursors.Cross;
                int i = e.HitTestResult.PointIndex;
                string time = this.dataTable.Rows[i]["时间"].ToString();
                string aFlow = this.dataTable.Rows[i]["A脉冲"].ToString();
                string bFlow = this.dataTable.Rows[i]["B脉冲"].ToString();
                string aPressure = this.dataTable.Rows[i]["A压力"].ToString();
                string bPressure = this.dataTable.Rows[i]["B压力"].ToString();
                string abRatio = this.dataTable.Rows[i]["AB比率"].ToString();
                e.Text = $"时  间:{time}\r\nA脉冲:{aFlow}\r\nB脉冲:{bFlow}\r\nA压力:{aPressure}\r\nB压力:{bPressure}\r\nAB比率:{abRatio}";
            }
            else
            {
                this.Cursor = System.Windows.Input.Cursors.Arrow;
            }
        }

5.4 往Chart中写入数据

 

        /// <summary>
        /// DataTable数据写入Chart中
        /// </summary>
        /// <param name="dataTable">包含数据的DataTable</param>
        /// <param name="chart">待写入数据的Chart</param>
        public void DataTableToChart(DataTable dataTable, Chart chart,string title, string series1, string series2)
        {
            chart.Series.Clear();   //清空图表中的内容
            chart.Titles.Clear();
            chart.Titles.Add(title);//添加标题
            chart.DataSource = dataTable;

            Series aCodeSeries = chart.Series.Add(series1);//添加第一个表
            aCodeSeries.ChartType = SeriesChartType.Line;//设为折线图显示
            aCodeSeries.YValueMembers = series1;//y轴为数据
            aCodeSeries.XValueMember = "时间";
            Series bCodeSeries = chart.Series.Add(series2);//添加第二个表
            bCodeSeries.ChartType = SeriesChartType.Line;//设为折线图显示
            bCodeSeries.YValueMembers = series2;
        }

往DataTable中写点数据,我的列名为"时间","A脉冲","B脉冲","A压力","B压力","AB比率"。

5.5显示效果

OVER~撒花

 

原文地址:https://www.cnblogs.com/stackmiao/p/11463284.html

时间: 2024-10-09 14:06:01

WPF调用Winform Chart控件绘图的相关文章

WPF 使用WinForm Chart控件

第一步:  页面 首先引用命名空间 xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:Chr="clr-namespace:System.Windows.Form

WinForm Chart控件使用记录(由于制作饼装,柱状,折线图)

由于公司的winform项目需要用到Chart图表,抽空研究了一下,特地发上来给大家做个参考,就目前而言用到的属性说明都做了注释: 主要用到Chart控件图表区域的属性有五个属性 Annotations 批注集合(我没怎么用到,但是配置的话会在图标区域出现一些可以备注的东西吧) ChartAreas 图表区属性:主要设置图标数据的背景,比如3D或者隐藏还是显示横纵轴交叉线,分块颜色显示等 Lengends 图表图例集合 主要设置图表边说明的一些东西,这次项目没什么用到,但是觉得这个基本没啥用,有

Winform Chart控件绘制阴影区域

先来看看效果 公司电力项目需要绘制这种工业图表,之前同事用Series绘制的 有点麻烦 需要计算起始点位置,后来我发现Chart控件本来就提供了这种阴影属性,简单方便 直接上代码 private void InitChart() { ChartArea chartArea2 = new ChartArea(); chartArea2.AxisX.Minimum = 10; chartArea2.AxisX.Maximum = 100; chartArea2.AxisX.Interval = 10

c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。

首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(ThreadFuntion); thread.IsBackground = true; thread.Start(); } private void Thread

Winform的Chart控件使用笔记

这里记录在使用Winform的Chart控件过程中发现的一些技巧点. 1. 撤销所有放大动作 chart1.ChartAreas[0].AxisX.ScaleView.ZoomReset(1); —— 撤销一次放大动作 chart1.ChartAreas[0].AxisX.ScaleView.ZoomReset(0); —— 撤销所有放大动作 Winform的Chart控件使用笔记

在DevExpress程序中使用Winform分页控件直接录入数据并保存

一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数据,这种对于字段比较少,而且内容相对比较简单的情况下,效率是比较高的一种输入方式.本篇随笔主要介绍在DevExpress程序中使用GridView直接录入数据并保存的实现,以及使用Winform分页控件来进行数据直接录入的实现操作. 1.在GridView上展示数据 在GridView上展示数据,只

C# Chart控件,chart、Series、ChartArea曲线图绘制的重要属性

原文有备份,如有错误和需要改进的地方,请不吝指正会继续修改的 8个月没写博客了- -,一来是有不想继续干开发的想法,二来是赖的写,三来还是不想总结.所以为了继续坚持自己的开发和总结的信念,总结一下C# chart控件的一些基本属性,由于属性太多了,一时半会儿写不完,以后继续补充,这里总结重要的常用的属性 为避免耽误不喜欢这种曲线图效果的亲们的时间,先看一下小DEMO效果图: 先简单说一下,从图中可以看到一个chart可以绘制多个ChartArea,每个ChartArea都可以绘制多条Series

WPF Step By Step 控件介绍

WPF Step By Step 控件介绍 回顾 上一篇,我们主要讨论了WPF的几个重点的基本知识的介绍,本篇,我们将会简单的介绍几个基本控件的简单用法,本文会举几个项目中的具体的例子,结合这些 例子,希望我们可以对WPF的掌握会更深刻.本文涉及的内容可能较多.请大家慢慢看看.错误之处,还请指出. 本文大纲 1.基本控件介绍与用法. 基本控件介绍与用法 文本控件 Label控件 label控件:一般用户描述性文字显示. 在Label控件使用时,一般给予用户提示.用法上没有什么很特殊的,label

c#中跨线程调用windows窗体控件

c#中跨线程调用windows窗体控件解决. 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thre