如何将DataTemplate与FrameworkContentElement一起使用?

时间:2014-02-19 22:33:13

标签: wpf

出于某些原因,我必须使用FrameworkContentElement子类实现WPF控件。

我的问题是

如何将DataTemplate与我自己的继承FrameworkContentElement类的元素一起使用?或者我是否必须重新实现自己的DataTemplate?

关于原因

我正在使用WPF来制作一个3d渲染控件,我希望这个Control使用的场景图像其他WPF控件一样被描述为与MVVM轻松绑定。

我使用FrameworkElement实现了这些控件,但是我在Measure方法中遇到了很大的性能问题,在我的例子中,我甚至没有使用过!

所以,我在网上发现FrameworkContentElement正是我​​正在寻找的,因为它没有进行任何测量计算。但另一方面,它似乎没有使用常见的有用元素,如DataTeamplates,ItemsControls,ContentControls等......

因此,如果您有任何建议,请随时回答!

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为你对WPF的一些事情感到困惑。

FrameworkElement不支持DataTemplates。 FrameworkElement仅支持也使用FrameworkContentElement的样式。多数民众赞成。

FrameworkElement和FrameworkContentElement仅支持WPF中的基础知识。

WPF中的CustomControls支持DataTempates。 CustomControls是ContentControl或ItemsControl,但也包括Button,ListBox,DataGrid ......这些控件继承自ContentControl或ItemsControl,并使用属性ContentTemplate或ItemsTemplate进行DataTemplate。

FrameworkContentElement是一种没有布局和渲染的FrameworkElement。你可以用零糖称它为FrameworkElement灯。

在处理FrameworkContentElements时,您基本上需要自己编写所有内容才能支持渲染,例如完全功能的VisualTree和LogicalTree。这就是为什么Microsoft仅使用FrameworkContentElement来定义文本在文档中的显示方式的原因。这是FrameworkContentElement的主要目的。文本没有进一步的孩子,因此它不需要测量或排列它们或者它既不需要功能齐全的VisualTree / LogicalTree。 只是文本,只需要渲染。

现在回答你的问题,如果你想要DataTemplates,你需要有一个继承自FrameworkContentElement的新类,它提供了定义自定义DataTemplates的属性。但是,稍后将在DataTemplates中的那些元素将需要布局和渲染,因为它们可能是UiElement类型。因此,您最终将为DataTemplates中的这些元素编写测量和排列逻辑。最后,一旦你设法为你的DataTemplates提供布局逻辑,你就会意识到你重新发明了ContentControl。此外,您还将意识到您再次遇到这些布局性能问题。

总结一下FrameworkContentControl中的DataTemplates通常无法正常工作,因为DataTemplates可能包含UiElements,UiElements需要布局......

所以真正的问题是如何欺骗Wpf。

那么你有一个继承自FrameworkElement的类并重写Measure和Arrange方法呢?

在这两个内部,您可以选择何时进行渲染以及何时进行渲染以获得性能增益。