C# 如何在自定义WPF控件(如折线图)中呈现动态数据?

C# 如何在自定义WPF控件(如折线图)中呈现动态数据?,c#,wpf,xaml,dynamic,wpf-controls,C#,Wpf,Xaml,Dynamic,Wpf Controls,我正在处理一个线形图控件,它包含许多依赖属性,这些属性会影响控件显示其数据的方式。例如,控件包含影响其轴的以下属性: AxisStroke-轴的颜色 轴厚度-轴的笔划厚度 它还包含显示数字和记号的属性 垂直记号-True/False指示记号是否沿垂直轴出现 水平刻度-True/False指示刻度是否沿水平轴显示 VerticalMin-垂直轴上的最小值(数字) 垂直步长-每个垂直刻度之间的距离 VerticalMax-垂直轴上的最大值(数字) 水平最小值-水平轴上的最小值(数字) 水平步长

我正在处理一个
线形图
控件,它包含许多
依赖属性
,这些属性会影响控件显示其数据的方式。例如,控件包含影响其轴的以下属性:

  • AxisStroke
    -轴的颜色
  • 轴厚度
    -轴的笔划厚度
它还包含显示数字和记号的属性

  • 垂直记号
    -True/False指示记号是否沿垂直轴出现
  • 水平刻度
    -True/False指示刻度是否沿水平轴显示
  • VerticalMin
    -垂直轴上的最小值(数字)
  • 垂直步长
    -每个垂直刻度之间的距离
  • VerticalMax
    -垂直轴上的最大值(数字)
  • 水平最小值
    -水平轴上的最小值(数字)
  • 水平步长
    -每个水平刻度之间的距离
  • HorizontalMax
    -水平轴上的最大值(数字)
还有更多的属性允许在单个图形上使用不同的线条样式(
LineColor
LineThickness
DataPointShape
、以及
DataPointIcon

我的目标是能够在XAML中调用我的
线形图
,将其插入
窗口
。我希望能够在XAML中指定这些设置,并在WPF设计器中查看控件的新渲染图像

现在,考虑到要在
线形图
上渲染的几何图形很多,我认为使用
画布
渲染数据是一个不错的选择。不幸的是,在使用XAML时,我无法根据控件的宽度和高度计算形状的位置

是的,必须计算形状的位置,因为图形的数据点是动态的,与记号相关的信息是动态的。更不用说,我想沿着
线图的每个轴显示实际值

所以,我想我可能能够显示这个控件,就好像我在用C代码进行渲染一样。其他窗口框架有时提供一种
渲染
方法,可用于布局所有子组件

然而,这样做似乎是不可能的,因为WPF在很大程度上依赖XAML来实现控件的视觉外观。此外,要求WPF设计器必须根据指定的属性和数据显示
线形图
,C#code似乎不能解决问题

我想我的问题是:

如何在WPF控件内动态呈现数据? 我是否能够在C#中指定控件的呈现方式,从而允许WPF设计器反映它?
旁注:
我已经做了很多研究,但我只找到了关于如何实现更简单类型控件的信息。如果您知道任何包含此主题信息的参考资料,请在您的答案之外随时发布。我将非常高兴地学习如何完全做到这一点

编辑: 我使用Excel创建了一个图形,以详细说明
LineGraph
控件如果具有正确的数据和属性可能会是什么样子


我将根据在WIN32、WinForm、WPF、WinCE、WP8+WinRT……甚至FPGA上实现定制图形库的经验来回答这个问题:)


从零开始实现一个是极其困难的。一开始可能看起来很简单,但你会遇到很多“如果发生这种情况,我该怎么办?”。例如,在上面的图表中,您似乎得到了一个数据点@(5100),它很好地描绘了它。但是让我们假设,我添加了另一个数据点@(5.000000005,0)。您将如何在代码中处理这一点?你会说图形上的每个像素代表X轴上的精确值,还是每个像素代表X轴值的范围

我建议您使用一个已经建立的库来做您想做的事情,除非您需要非常具体的东西,比如说您需要图形上的水平游标(想想Tektronix示波器),并且您需要计算两个游标之间的一些值。。然后,您可能需要实现您自己的定制或在开源基础上构建

因此,如果您仍然坚持创建自己的自定义控件,那么以下是您的问题的答案


如何在WPF控件内动态呈现数据

可以使用WriteableBitmap并从中创建自己的图元图形库。渲染完成后,将其设置为控件的ImageSource。 或者您可以使用WriteableBitmapEx,它已经为您实现了类似GDI的绘图功能
,我也认为你也可以从NuGet那里得到它
您还可以使用
并向其中添加UI元素


我是否能够在C#中指定控件的呈现方式,从而允许WPF设计器反映它

这取决于创建控件的方式,但是可以在自定义控件中创建将显示在设计器中的属性。允许您更改它,从而更新显示。我会读很多关于编写自定义用户控件库的教程。他们的解释比我的回答更好。如果您正确实现了这些属性,它应该是这样的……


全尺寸图像:

将行数从15更改为10,并将起始Y偏移量更改为-1(从而将图形向上移动,使行更高)

全尺寸图像:

您看过了吗?您可以注册您的