65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 实时监视器控件(滚动监视器)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (10投票s)

2008年4月25日

CPOL

3分钟阅读

viewsIcon

93826

downloadIcon

5958

一篇介绍 WPF 实时监视器控件的文章,用于创建连续数据的实时视图

代码版本 1.0.0.1

^^^ 监视器演示

monitor2.jpg

^^^ 滚动监视器,如 CIRIP(计算智能铁路干预规划器)中所用,用于监视连接数和线程数。

引言

本文介绍了 WPF 滚动监视器,又称实时监视器控件。它用于以简单易用的控件呈现实时连续数据,并支持自动更新。该监视器显示数据的方式与 Microsoft Windows 任务管理器 > 性能 CPU 使用率历史记录视图类似。

Using the Code

监视器围绕两个类构建:RollingSeries RollingMonitorRollingMonitor 是添加到界面的控件,而 RollingSeries 代表连续数据流。

RollingSeries

构造函数接受对已实例化 RollingMonitor 的引用和一个 NextValueDelegateNextValueDelegate...

public delegate double NextValueDelegate();

... 返回连续数据趋势的当前值(例如,当前 CPU 使用率)。

RollingSeries 具有以下访问器属性:

  • IsRunning - 暂停从 NextValueDelegate 读取的线程。请注意,暂停一个 RollingSeries 不会自动暂停与特定 RollingMonitor 相关联的所有其他 RollingSeries
  • LineBrush - 用于在监视器上渲染数据的画笔。
  • LineThickness - 在监视器上渲染的线条的粗细。

RollingMonitor

如前所述,RollingMonitor 类是添加到用户界面的 UIElement,用于显示 RollingSeries 的数据。它有许多属性可用于自定义显示输出的外观和感觉:

  • MaxValue - 监视器能够显示的最大值;任何大于此值的值都将显示为最大值级别(参见演示示例)。
  • MinValue - 监视器能够显示的最小值;任何低于此值的值都将显示为最小值级别。
  • MaintainHistoryCount* - 要维护的先前历史数据数量;值越高,渲染的计算复杂度和内存使用量就越大,但值太低则整个监视器将不会被填满。
  • UpdateInterval - 在检索下一个数据之前的时间量(以毫秒为单位);值越高,监视器的速度就越慢,因此 MaintainHistoryCount 可以降低,从而降低计算复杂度。UpdateInterval 值越低,动画看起来就越卡顿。
  • MinValueSpacing - 用于设置 UpdateInterval 之间的最小间距,以防止在控件调整为非常窄的相对宽度时数据变得混乱。

*注意,在版本 1.0.0.1 中,必须在创建 RollingSeries 之前设置 RollingMonitor 的参数;这将在后续版本中得到改进。

示例代码

Window1.xaml

<Window x:Class="WPFRollingMonitorDemonstration.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:rolling="clr-namespace:DNBSoft.WPF.RollingMonitor;assembly=WPFRollingMonitor"
    Title="Rolling Monitor Demonstration" Height="100" Width="300">
    <rolling:RollingMonitor Name="monitor" Margin="5"/>
</Window>

Window1.xaml.cs

namespace WPFRollingMonitorDemonstration
{
    public partial class Window1 : Window
    {
        private Random random = new Random();

        public Window1()
        {
            InitializeComponent();

            RollingSeries s1 = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(NextValue));
            RollingSeries s2 = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(NextValue));
            s2.LineBrush = new SolidColorBrush(Color.FromRgb(255, 0, 0));
            s2.LineThickness = 0.25;
            RollingSeries s3 = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(NextValue));
            s3.LineBrush = new SolidColorBrush(Color.FromRgb(0, 255, 0));
            s3.LineThickness = 0.25;

            monitor.MaxValue = 25;
        }

        private double NextValue()
        {
            return random.Next(0, 100);
        }
    }
}

创建了三个 RollingSeries 实例,所有实例都使用相同的 RollingMonitor 和一个返回介于 0100 之间的随机数的委托进行初始化。但请注意,滚动监视器的最大值设置为 25,因此任何高于 25 的值都显示为 25(见上文)。

待办事项

  • 允许在添加 RollingSeries 后修改 RollingMonitor 参数。
  • 通过用户界面自定义监视器数据系列。
  • 性能优化。
  • 自动缩放。
  • 轴标签。

历史

版本 1.0.0.0 - 初始构建

其他许可说明

请随时在您的工作中自由使用此代码,但请注意,正在使用修改后的 Code Project 开放许可证 (CPOL);基本上,它与标准许可证相同,只是此代码不得在未经事先授权的情况下用于商业或非营利性商业用途。请参阅随附的源代码和演示文件中的 license.txt 或 license.pdf。

© . All rights reserved.