c# - 使用图表显示我在 WPF 上每秒更新的数据

标签 c# wpf xaml charts wpftoolkit

我正在尝试获取每秒的 CPU 使用率。我为此设置了代码,所以没有问题。我试图在折线图上表示此信息。我正在使用 wpf 工具包。我打算让图表有点类似于下图。包含秒数的 y 轴,包含 cpu 使用率的 x 轴。

所以它就像秒数和 cpu 使用率在图表上不断更新。 (如果这不是一个好方法,我想要一些关于在图表上显示我的 CPU 使用率的更好方法的建议。)

enter image description here

我正在尝试找到一种方法来设置我的 dispatcherTimer,它每秒滴答一次以在 y 轴上更新。

这是我当前图表的样子。

enter image description here

我对此一无所知,但我真的不确定如何将其设置为我正在寻找的东西。我相信我必须处理 pointcollection 值,但不能直接用 timer.tick (dispatchtimer) 替换数字。

图表代码如下:

<chartingToolkit:Chart Canvas.Left="25" Canvas.Top="307" Title="CPU Usage">
                    <chartingToolkit:Chart.DataContext>
                        <PointCollection>1,10 2,20 3,30 4,40</PointCollection>
                    </chartingToolkit:Chart.DataContext>
                    <chartingToolkit:LineSeries DependentValuePath="X" IndependentValuePath="Y" ItemsSource="{Binding}" Title="Cpu Usage">
                        <chartingToolkit:LineSeries.Background>
                            <RadialGradientBrush Center="0.075,0.015" GradientOrigin="-0.1,-0.1" RadiusY="0.9" RadiusX="1.05">
                                <GradientStop Color="#FFA9A3BD"/>
                                <GradientStop Color="#FF6C5B2C" Offset="1"/>
                            </RadialGradientBrush>
                        </chartingToolkit:LineSeries.Background>
                    </chartingToolkit:LineSeries>
                </chartingToolkit:Chart>

我知道这个问题很可能不清楚,但我不知道该怎么说。我也找不到任何指南引用。如果这有助于更好地理解,我可以发布检索 CPU 使用率结果(每秒)的代码。不想用太多信息来解决这个问题。感谢您的指导。

计算每秒 CPU 使用率的代码:

class Monitor
{
    Stats stats = new Stats();

    public delegate void CPUEventHandler(object sender, CPUEventArgs args);
    public event CPUEventHandler CPUEvent;

    DispatcherTimer timer = new DispatcherTimer();

    private static double cpuCurrent;

    public Monitor()
    {
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += TimeChanged;
        timer.Start();
    }

    void TriggerCPUEvent(CPUEventArgs args)
    {
        if (CPUEvent != null)
        {
            CPUEvent(this, args);
        }
    }

    public void TimeChanged(object sender, EventArgs e)
    {
        cpuCurrent = stats.GetCurrentCpuUsage();

        TriggerCPUEvent(new CPUEventArgs(cpuCurrent));
    }
}

class Stats
{
    private PerformanceCounter cpuCounter;

    public Stats()
    {
        cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    }

    public float GetCurrentCpuUsage()
    {
        return cpuCounter.NextValue();
    }
}

最佳答案

  1. 定义数据模型以提供图表(在最简单的情况下为 ObservableCollection)
  2. 在每次引发 TriggerCPUEvent 时添加一些逻辑来更新上面的集合(从普通事件处理程序到 Reactive Extensions 聚合的各种选项)- 注意你的集合的大小,因为如果你允许你的 WPF Chart 不会表现很好收集无限增长
  3. 将您的线系列绑定(bind)到底层集合,瞧!

如果您需要显示更大的数据 block 并保持良好的 UI 响应水平,请考虑编写您自己的直接与 DrawingContext 交互的图表控件 - WPF 工具包图表不是性能最高的图表

关于c# - 使用图表显示我在 WPF 上每秒更新的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21953512/

相关文章:

c# - MVC 5 中的 System.Data.Entity.Core.ProviderIncompatible 异常

.net - WPF触发器更改父属性

wpf - 使用Reactiveui订购可观察的集合

silverlight - 在AutoCompleteBox的Silverlight 4工具箱示例中,如何切换xaml中的下拉列表?

c# - WPF 如何将 XML 与多个命名空间绑定(bind)

c# - 无法从 List<DateTime?> 转换为 List<dynamic>

c# - 如何从 getter 或 setter 调用异步方法?

c# - .NET 中的 Xml 序列化

c# - 什么会导致 WM_NCHITTEST lParam 溢出 32 位整数?

c# - 从文件夹、其子文件夹和其中的所有文件中删除只读