出于某些原因,我必须使用FrameworkContentElement子类实现WPF控件。
如何将DataTemplate与我自己的继承FrameworkContentElement类的元素一起使用?或者我是否必须重新实现自己的DataTemplate?
我正在使用WPF来制作一个3d渲染控件,我希望这个Control使用的场景图像其他WPF控件一样被描述为与MVVM轻松绑定。
我使用FrameworkElement实现了这些控件,但是我在Measure方法中遇到了很大的性能问题,在我的例子中,我甚至没有使用过!
所以,我在网上发现FrameworkContentElement正是我正在寻找的,因为它没有进行任何测量计算。但另一方面,它似乎没有使用常见的有用元素,如DataTeamplates,ItemsControls,ContentControls等......
因此,如果您有任何建议,请随时回答!
谢谢。
答案 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方法呢?
在这两个内部,您可以选择何时进行渲染以及何时进行渲染以获得性能增益。