我应该什么时候使用装饰者?

WPF是伟大的,因为有很多方法来实现你的目标。 例如,据我所知,装饰者可以添加一些控件到UI元素,但是我认为通过包含附加元素的自定义控件也可以实现相同的行为。

所以,我的问题是:什么时候我应该更喜欢装饰者更复杂(但我认为更灵活)的自定义控件? 请考虑我广泛使用MVVM模式,我想绑定命令的附加元素。

特别是,我正在devise一个图表devise器应用程序,我想添加连接点到我的形状。 另一个我应该在自定义控件和装饰者之间做出决定的例子是显示一个自动定位以“跟随”该行的标签的行。

谢谢

装饰者在大多数情况下需要比使用ControlTemplates更多的工作。 如果您想要装饰者提供的附加function,请使用它们。 否则使用ControlTemplates。

以下是Adorners带来的主要特点:

  1. 因为装饰物在一个单独的图层上,即使装饰元素被剪裁,视觉也可以延伸到装饰元素之外。
  2. 由于装饰器在单独的图层上,所以它们通常不会被AdornedElement的容器或兄弟控件遮挡。
  3. 装饰者会自动通知所装饰元素的尺寸和位置的所有变化,从而可以对布局变化做出反应,而这种变化在普通的控制中并不容易实现。
  4. 装饰者可以应用于面板和现有的控制,而不需要对其模板或其他方面进行任何改变。 这使得它们可以在任意控件上提供操作手柄或视觉反馈。
  5. 在很多情况下,您只会为几百或几千个“活动”项目创build装饰。 使用ControlTemplates实现相同的function可能会大大降低效率,如果您必须添加一个额外的面板到模板:模板的每一个instatiation将有额外的面板,而只有一个装饰。

以下是与使用装饰图案相关的一些潜在成本,而不是ControlTemplates:

  1. 您必须编写代码来调用.GetAdornerLayer().Add()并pipe理Adorner的生命周期
  2. 您必须为您的Adorner编写渲染代码,或添加代码以将Control包含为装饰器的子代,以便您可以使用ControlTemplate
  3. 您通常会在代码中执行您的自定义度量/排列计算(除非您在装饰器中使用ControlTemplate)
  4. 如果您希望由目标控件处理它们,则需要将RoutedEvents转发给AdornedElement
  5. 如果你想使DataContext跨越你需要添加一个DataContext="{Binding AdornedElement.DataContext}"
  6. 看起来,可见的装饰者在每一个布局过程中都被扫描,所以一旦在屏幕上有数千个装饰者会导致明显的减速。 (普通的视觉效果只有在直接影响到他们的东西发生变化时,才会调用他们的度量/安排代码。)
  7. 如果有超过144个装饰者不受支持 ,那么如果有任何接近这个限制的风险,那么控制模板就更适合了。

在你的具体例子中,没有明确的正确答案。

  • 我倾向于使用ControlTemplate作为连接点,因为大概需要一种方法来指定连接点的位置,而ControlTemplate已经定义了该项目本身的布局。 另一方面,如果连接点信息是数据驱动的并且仅出现在主动控制器上(或者被拖动的控制器),则使用装饰器可以更好地获得性能优势并简化单独的控制模板。

  • 一个自动定位的标签可以很好地适合装饰的计算angular度来看,如果这些线条是简单的直线,但如果你可能会有一万个可见的一次,我会担心性能。

不知道更多关于你的应用程序,很难说比这更多。