如何在WPF中有效地显示图形?

Sug*_*rue 7 .net c# wpf graphics

我们的软件具有时间轴功能.它显示了一些小blob,表示不同时间点的数据.代码是c#,.Net 4和WPF.为了显示blob,我们正在创建一个边框(给它一个画笔)并将其添加到网格中.然后将该网格添加到形成行的父网格中.

当时间线显示相对较少的blob时,这很好,但是当数据非常繁忙时,渲染变慢,mem使用率上升,并且UI无响应.(毫不奇怪).

我知道我们不是以最好的方式做到这一点 - 我的问题是在wpf中显示这样的图形的最佳方法是什么?

编辑:感谢您下面的回复 - 我将调查这些选项.但是每个都需要大量的重新编码,我的问题更简单; 是否有一些控制或效果我可以用来取代资源成本较低的边界?

J..*_*... 4

对于这样的数据可视化,我真的很喜欢DynamicDataDisplay。该组件目前仅针对 Silverlight 进行维护/开发,但有一个针对 WPF 的开源(链接)版本,这确实是一个很棒的库。

该库使用IObservable集合并支持DateTime轴值。

有一个内置的标记图表类型(示例如下)。

您可以使用自定义标记,它支持缩放和滚动,还有许多其他不错的功能等。即使处理相当大的数据集,它也非常快。

由于数据集是IObservable图表组件,因此图表组件会动态响应基础数据集中的更改,因此只要数据集合更新,您的图表就会更新。

编辑

这是一个例子:

用途:

using System.ComponentModel;
using Microsoft.Research.DynamicDataDisplay;
using Microsoft.Research.DynamicDataDisplay.Charts;
using Microsoft.Research.DynamicDataDisplay.DataSources;
using Microsoft.Research.DynamicDataDisplay.PointMarkers;
Run Code Online (Sandbox Code Playgroud)

主要的 :

 public Window1()
    {
        InitializeComponent();
        //
        const int N = 100;
        List<double> x = new List<double>();
        List<double> y = new List<double>();

        DateTimeAxis dtAxis = new DateTimeAxis();
        _plotter.HorizontalAxis = dtAxis;

        Random rand = new Random();
        for (int i = 0; i < N; i++)
        {   //generate some random data
            x.Add(dtAxis.ConvertToDouble(DateTime.Now.AddDays(i)));
            y.Add(rand.Next(N));
        }

        EnumerableDataSource<double> gX = new EnumerableDataSource<double>(x);
        EnumerableDataSource<double> gY = new EnumerableDataSource<double>(y);
        _MarkerGraph.DataSource = new CompositeDataSource(gX,gY);

        //no scaling - identity mapping
        gX.XMapping = xx => xx;
        gY.YMapping = yy => yy;

        CirclePointMarker mkr = new CirclePointMarker();
        mkr.Fill = new SolidColorBrush(Colors.Red);
        mkr.Pen = new Pen(new SolidColorBrush(Colors.Black),2.0);
        _MarkerGraph.Marker = mkr;
    }
Run Code Online (Sandbox Code Playgroud)

XAML:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d3="clr-namespace:Microsoft.Research.DynamicDataDisplay;assembly=DynamicDataDisplay"
Title="Window1" Height="481" Width="651">
<Grid>
    <d3:ChartPlotter Name="_plotter">
        <d3:MarkerPointsGraph Name="_MarkerGraph"/>
    </d3:ChartPlotter>
</Grid>
Run Code Online (Sandbox Code Playgroud)

输出 : 程序运行...

DateTime 轴可以完美地缩放,调整天、月、小时、秒的刻度......任何合适的内容。易如反掌!

如果您确实使用此包,我强烈建议您下载源代码并将其作为第二个项目添加到您的解决方案中。D3 的文档非常差,项目中的源代码有助于弄清楚事情是如何工作的。如果需要的话,它还可以非常轻松地添加/扩展内容。如果执行此操作,请务必引用您的解决方案内项目,而不是已编译的 DLL。

另请注意,许多可用文档和在线示例都是针对维护的 Silverlight 组件,而不是针对开放的 WPF 组件。这两个版本之间的许多组件都不同,因此您必须深入研究 WPF 组件以了解其中的内容。上面的示例适用于 v0.3 WPF 组件。