C# 强制DataTemlate返回特定对象
我正在编写一个新的WPF控件来绘制和编辑很多形状,比如说数十万个。为此,我想让用户为其数据定义C# 强制DataTemlate返回特定对象,c#,wpf,custom-controls,C#,Wpf,Custom Controls,我正在编写一个新的WPF控件来绘制和编辑很多形状,比如说数十万个。为此,我想让用户为其数据定义DataTemplate。但是此特定数据模板的LoadContent必须返回特定类型的IShape。我怎样才能做到这一点 首先,模板的全部目的是支持插入任意可视树。如果您对模板的组成有严格的要求,那么使用模板是错误的设计选择 其次,模板必须描述一个可视的。如果你要画数十万个形状,你将无法将它们表示为视觉效果。视觉效果很重 他们参与输入命中测试(!) 它们拥有依赖对象的所有开销。 它们参与继承上下文 它们
DataTemplate
。但是此特定数据模板的LoadContent
必须返回特定类型的IShape
。我怎样才能做到这一点 首先,模板的全部目的是支持插入任意可视树。如果您对模板的组成有严格的要求,那么使用模板是错误的设计选择
其次,模板必须描述一个可视的。如果你要画数十万个形状,你将无法将它们表示为视觉效果。视觉效果很重
他们参与输入命中测试(!)
它们拥有依赖对象的所有开销。
它们参与继承上下文
它们必须将特性更改传达给其父级,即影响布局和渲染的特性
它们可能包含动态资源引用,必须观察这些引用的更改
它们可以扩展更重的ui元素
,或者更重的框架元素
,这意味着:
他们参与布局(!)
路由事件通过它们传递,并且可以由它们处理
他们可能正在使用数据绑定
作为替代方案,我建议您提供一个接口,通过该接口可以向您提供几何体数据,您可以冻结、共享、重用和高效渲染。这将允许您坚持使用WPF中可用的最低级别的图形API集。但是,老实说,即使这样也可能不够好
不过,有一件事是肯定的:在中呈现所有这些形状是不可能的。至少,我会实现某种形式的虚拟化,在这种虚拟化中,您可以有效地只定位视图中的形状(四叉树或类似的?),只渲染视图中的几何体(使用剪辑),并使用缓存合成来避免不断重绘;重新细分;如果没有任何实际变化,则对几何体执行逐基元抗锯齿。首先,模板的整个要点是支持插入任意可视树。如果您对模板的组成有严格的要求,那么使用模板是错误的设计选择
其次,模板必须描述一个可视的。如果你要画数十万个形状,你将无法将它们表示为视觉效果。视觉效果很重
他们参与输入命中测试(!)
它们拥有依赖对象的所有开销。
它们参与继承上下文
它们必须将特性更改传达给其父级,即影响布局和渲染的特性
它们可能包含动态资源引用,必须观察这些引用的更改
它们可以扩展更重的ui元素
,或者更重的框架元素
,这意味着:
他们参与布局(!)
路由事件通过它们传递,并且可以由它们处理
他们可能正在使用数据绑定
作为替代方案,我建议您提供一个接口,通过该接口可以向您提供几何体数据,您可以冻结、共享、重用和高效渲染。这将允许您坚持使用WPF中可用的最低级别的图形API集。但是,老实说,即使这样也可能不够好
不过,有一件事是肯定的:在中呈现所有这些形状是不可能的。至少,我会实现某种形式的虚拟化,在这种虚拟化中,您可以有效地只定位视图中的形状(四叉树或类似的?),只渲染视图中的几何体(使用剪辑),并使用缓存合成来避免不断重绘;重新细分;如果没有实际更改,则对几何体执行逐基元抗锯齿。DataTemplate
的LoadContent
方法返回模板内容的根元素。因此,如果用户(消费者)已准确地将IShape
定义为模板中的根元素,它将只返回IShape
但是,您不能真正强制类的使用者将DataTemplate
类型的属性设置为DataTemplate
,该属性保证包含IShape
。消费者还可以将属性设置为只包含(比如)按钮的数据模板
如果LoadContent
方法返回的不是IShape
,那么您可以在运行时在类中抛出一个invalidoOperationException
。不过,您不能在编译时做出任何保证。但这就是DataTemplates
的工作方式
也许你应该考虑让用户设置<代码> iSave<代码>属性,而不是<代码>数据板< /代码>属性。您可以让
IShape
(或Shape
)成为某种ContentControl
或UserControl
毕竟,DataTemplate
是一个可以包含任何UIElement
的模板,DataTemplate
的LoadContent
方法返回模板内容的根元素。因此,如果用户(消费者)已准确地将IShape
定义为模板中的根元素,它将只返回IShape
但是,您不能真正强制类的使用者将DataTemplate
类型的属性设置为DataTemplate
,该属性保证包含IShape
。消费者还可以将属性设置为一个DataTemplate
,即c