DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果

摘要:
项目需要原始地址。最近,我在寻找一篇关于绘制实时曲线图的文章,但我发现我自己的许多实现都太慢了,所以我使用了第三方控件来实现它。现在我们来介绍动态数据显示中实时曲线图的功能。因为类似的配置文章可以在互联网上找到。首先,我们需要到官方网站下载dll。DynamicDataDisplay找到所需的DynamicDataDisplay。dll,在项目中引用它,然后在项目中配置命名空间xmlns:d3=“http://research.microsoft.com/DynamicDataDisplay/1.0“在内容中添加基本配置的问题已经解决。实时显示CPU利用率的问题可以自己找到。我在这里不做解释。

原文地址

 由于项目需要,最近在找关于绘制实时曲线图的文章,但看了很多自己实现的话太慢,所以使用了第三方控件来实现(由于是项目中使用所以我比较倾向与开源的项目,如果出问题的话可以很好的找到根源)。这里记录是让我以后可以回顾,也可以让志同道合的程序猿减少搜索时间。

        下面我们就介绍一下DynamicDataDisplay中实时曲线图的功能(其他没有时间去研究),由于在网上能找到类似的配置文章。

首先我们要去官网下载dll(或者直接NuGet,这里没有用过就不介绍了),DynamicDataDisplay找到需要的DynamicDataDisplay.dll并在项目中引用

然后在项目中配置命名空间 xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0",再在内容中添加<d3:ChartPlotter>基本配置问题就已经解决。

     CPU的使用率的实时显示问题,CPU所使用的api可以自己去查找,我这里就不说明了。

     下面我们来直接贴代码

MainWindow.xaml文件内容如下:

[html] view plain copy
  1. <Window xmlns:dxga="http://schemas.devexpress.com/winfx/2008/xaml/gauges"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         x:Class="LinechartApplication.MainWindow"  
  5.         Title="MainWindow" Height="400" Width="650"  
  6.         xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0" Loaded="Window_Loaded">  
  7.     <Grid>  
  8.         <Grid.RowDefinitions>  
  9.             <RowDefinition Height="Auto"/>  
  10.             <RowDefinition Height="*"/>  
  11.         </Grid.RowDefinitions>  
  12.         <StackPanel Orientation="Horizontal">  
  13.             <Button Content="滚屏or不滚屏"  Click="Button_Click"/>  
  14.         </StackPanel>  
  15.         <d3:ChartPlotter x:Name="plotter" Margin="10,10,20,10" Grid.Row="1">  
  16.             <d3:ChartPlotter.VerticalAxis>  
  17.                 <d3:VerticalIntegerAxis />  
  18.             </d3:ChartPlotter.VerticalAxis>  
  19.   
  20.             <d3:ChartPlotter.HorizontalAxis>  
  21.                 <d3:HorizontalIntegerAxis />  
  22.             </d3:ChartPlotter.HorizontalAxis>  
  23.   
  24.             <d3:Header Content="CPU 实时性能"/>  
  25.             <d3:VerticalAxisTitle Content="百分比"/>  
  26.         </d3:ChartPlotter>  
  27.     </Grid>  
  28. </Window>  

[csharp] view plain copy
  1. using System;  
  2. using System.Globalization;  
  3. using System.IO;  
  4. using System.Reflection;  
  5. using System.Threading;  
  6. using System.Windows;  
  7. using System.Diagnostics;  
  8. using System.Windows.Threading;  
  9. using System.Windows.Media;  
  10. using Microsoft.Research.DynamicDataDisplay;  
  11. using Microsoft.Research.DynamicDataDisplay.DataSources;  
  12. using System.Collections;  
  13.   
  14. namespace LinechartApplication  
  15. {  
  16.     /// <summary>  
  17.     /// MainWindow.xaml 的交互逻辑  
  18.     /// </summary>  
  19.     public partial class MainWindow : Window  
  20.     {  
  21.   
  22.         private ObservableDataSource<Point> dataSource = new ObservableDataSource<Point>();  
  23.         private PerformanceCounter performanceCounter = new PerformanceCounter();  
  24.         private DispatcherTimer dispatcherTimer = new DispatcherTimer();  
  25.         private int currentSecond = 0;  
  26.   
  27.         bool buttonbool = false;//标志是否滚屏  
  28.         public MainWindow()  
  29.         {  
  30.             InitializeComponent();  
  31.   
  32.         }  
  33.   
  34.         private void Window_Loaded(object sender, RoutedEventArgs e)  
  35.         {  
  36.             plotter.AddLineGraph(dataSource, Colors.Red, 2, "百分比");  
  37.             plotter.LegendVisible = true;  
  38.             dispatcherTimer.Interval = TimeSpan.FromSeconds(1);  
  39.             dispatcherTimer.Tick += timer_Tick;  
  40.             dispatcherTimer.IsEnabled = true;  
  41.             plotter.Viewport.FitToView();  
  42.         }  
  43.   
  44.         int xaxis = 0;  
  45.         int yaxis = 0;  
  46.         int group = 20;//默认组距  
  47.   
  48.         Queue q = new Queue();  
  49.         private void timer_Tick(object sender, EventArgs e)  
  50.         {  
  51.             performanceCounter.CategoryName = "Processor";  
  52.             performanceCounter.CounterName = "% Processor Time";  
  53.             performanceCounter.InstanceName = "_Total";  
  54.             double x = currentSecond;  
  55.             double y = performanceCounter.NextValue();  
  56.             Point point = new Point(x, y);  
  57.             dataSource.AppendAsync(base.Dispatcher, point);  
  58.             if (wendu)  
  59.             {  
  60.                 if (q.Count < group)  
  61.                 {  
  62.                     q.Enqueue((int)y);//入队  
  63.                     yaxis  = 0;  
  64.                     foreach (int c in q)  
  65.                         if (c > yaxis)  
  66.                             yaxis = c;  
  67.                 }  
  68.                 else {  
  69.                     q.Dequeue();//出队  
  70.                     q.Enqueue((int)y);//入队  
  71.                     yaxis = 0;  
  72.                     foreach (int c in q)  
  73.                         if (c > yaxis)  
  74.                             yaxis = c;  
  75.                 }  
  76.   
  77.                 if (currentSecond - group > 0)  
  78.                     xaxis = currentSecond - group;  
  79.                 else  
  80.                     xaxis = 0;  
  81.   
  82.                 Debug.Write("{0} ", yaxis.ToString());  
  83.                 plotter.Viewport.Visible = new System.Windows.Rect(xaxis, 0, group, yaxis);//主要注意这里一行  
  84.             }  
  85.             currentSecond++;  
  86.         }  
  87.   
  88.         private void Button_Click(object sender, RoutedEventArgs e)  
  89.         {  
  90.             if (wendu)  
  91.             {  
  92.                 wendu = false;  
  93.             }  
  94.             else {  
  95.                 wendu = true;  
  96.             }  
  97.         }  
  98.     }  
  99. }  


DynamicDataDisplay实现实时显示曲线的功能有很多但没有看到x轴移动的功能所以下面就是主要内容(如何沿着x轴移动
在使用DynamicDataDisplay时候我发现会出现图像缩放的情况(就是x轴一直被缩放,所有数据都会被压缩在一块,很不方便)。使用plotter.Viewport.Visible = new System.Windows.Rect(xaxis, 0, group, yaxis);这行代码就可以解决按照x轴移动的功能。这个就像一个窗口,我们定义窗口位置和大小就能想看到我们所需要的数据。第一和第二个参数是原点坐标,第三个参数是X轴长度,第四个参数是Y长度。定义好了之后所有在这个区间的内容都会被显示,多余的参数不显示。随着窗口的移动也就是X轴移动的功能。

代码中,使用了队列,队列的长度就等于显示窗口的长度也就是X轴的长度。队列的作用是取该队列中最大的值来确定窗口的高度。

  不滚屏时图像(我们可以看到X轴都挤到一块)

DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果第1张

  滚屏时图像(我们可以看到X起始点和结束点)

DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果第2张

      资源下载http://download.csdn.net/detail/u013187531/9842653

免责声明:文章转载自《DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇div.load()方式局部刷新div谈谈localhost与127.0.0.1下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF省市联动Binding

主要思路: 把省的ItemsSource绑定DataContext,然后给市的ItemsSource绑定到Element(省)的SelectedItem上 xaml 1 <Window x:Class="Demo.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/20...

WPF Geometry几何图形数据图标

相信大家在阅读WPF相关GitHub开源项目源码时都会看见一串串这种数据这种Geometry数据就是几何图形数据 为什么要用Geometry数据做图标? 有一种做法是使用ttf字体文件代替,不过使用ttf字体文件会出现下面几个缺点:1、团队协作不便于管理2、需要依赖特定平台3、无法灵活使用而使用Geometry的话,我们可以将这些几何图形数据存入资源字典R...

微软WPF技术应用与实践系列(窗体与导航+容器+模型+数据绑定配多个应用案例)

课程学习地址:http://www.ibeifeng.com/goods.php?id=160 自从微软推出第一个版本的.NET Framework,已经过去差不多8年了。3.0 是第一个随操作系统发布的框架,它附带在每个Windows Vista中,也可以支持Windows XP SP2 和 Windows Server 2003。由于.NET 2.0和...

Windows Phone开发-开发环境和结构

      Windows Phone 7.1的开发工具发布了,一直对WP7很关注,现在终于可以开始学习了。其实09年就学习过silverlight,看过3的SDK文档,当时因为工作,断断续续也没有坚持下来,所以这次学习WP7顺便重新学习SL。      上周安装了WP7.1的开发环境,工作之余看了一周文档。目前关于WP的学习文档大多是英文的,chian-...

关于微软Silverlight,你应该知道的10件事

对于任何成长中的企业来说,设计一个合适的网站是一件非常重要的事情,但是如何让你的网站具有富互联网应用程序(Rich Internet Applications,RIA)的体验却不是那么简单。为了在这方面为开发者减轻负担,微软最近推出了Silverlight——这是一个针对Web开发者而推出的跨平台、跨浏览器的插件。这个目前以“候选版”形式提供的插件可以支持...

Windows App开发之开发准备

操作系统及SDK 操作系统 显而易见,想要开发Windows App就得在Windows 8/8.1/10上进行,老旧的Windows XP/Vista/7已经不能满足时代的需要了。当然,在Windows App的发展过程中,其本身也有着较大的变动,为了使用新的特性,建议使用Windows 10。我在写这个教程时,Windows 10正式版并未面世,因此...