WPF等效于OwnerDraw

时间:2014-04-15 13:19:21

标签: .net wpf winforms ownerdrawn

在我目前维护的WinForms应用程序中,我有一个树控件,其中有数千个节点。每个节点都是使用自定义的动态生成的图标绘制的(每个图标都是唯一的)。我正在考虑将此应用程序转换为WPF,但我不知道如何正确处理此树视图。我知道在WPF中执行此操作的标准方法是为每个项目使用模板,并为我的图标内容提供图像控件,但如果我绑定数千个动态创建的图像,我会担心性能。使用OwnerDraw,我不必存储图标,只有当节点实际可见时,我才能生成并绘制它。

在WPF中是否有处理此方案的标准方法?

可以看到当前应用程序的屏幕截图here,让您了解我正在处理的内容。

1 个答案:

答案 0 :(得分:1)

正确的树实现将始终虚拟化其项目,这意味着只有当前显示的项目将绑定到数据并进行渲染。了解这一点,只需在需要时动态生成图像。

查看侧面,项目模板:

<DataTemplate>
  <Image Source="{Binding Image}" />
<DataTemplate>

模特方:

private ImageSource _image;

public ImageSource Image {
  get { return _image ?? (_image = CreateImage()); }
}

private ImageSource CreateImage() {
   // load your image dynamically here
   // If you're creating it from scratch, WriteableBitmap might help you
}

此代码将图像缓存到_image字段中。如果您不需要它,您可以在每次访问Image时重新创建它(注意不要经常访问该属性)。