Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制DataTemlate返回特定对象_C#_Wpf_Custom Controls - Fatal编程技术网

C# 强制DataTemlate返回特定对象

C# 强制DataTemlate返回特定对象,c#,wpf,custom-controls,C#,Wpf,Custom Controls,我正在编写一个新的WPF控件来绘制和编辑很多形状,比如说数十万个。为此,我想让用户为其数据定义DataTemplate。但是此特定数据模板的LoadContent必须返回特定类型的IShape。我怎样才能做到这一点 首先,模板的全部目的是支持插入任意可视树。如果您对模板的组成有严格的要求,那么使用模板是错误的设计选择 其次,模板必须描述一个可视的。如果你要画数十万个形状,你将无法将它们表示为视觉效果。视觉效果很重 他们参与输入命中测试(!) 它们拥有依赖对象的所有开销。 它们参与继承上下文 它们

我正在编写一个新的WPF控件来绘制和编辑很多形状,比如说数十万个。为此,我想让用户为其数据定义
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