0

我创建了一个在 OnRender 方法中绘制一些自定义图形的装饰器。图形取决于包含装饰器的对象的位置。我通过样式通过模板属性设置装饰器。问题是装饰器的 OnRender 方法在应用模板时只被调用一次。因此,当我更改对象的位置并在该对象上调用 InvalidateVisual() 时,不会重新渲染装饰器。

我设法通过将对象的模板设置为 null 然后将其重置回相同的模板来解决此问题,如下所示:

if (myObject.Template != null)
{
  ControlTemplate tmpTemplate = myObject.Template;
  myObject.Template = null;
  myObject.Template = tmpTemplate;
}

这可以解决问题,但我确信这不是应该的方式。我错过了什么?

4

1 回答 1

0

我想您可能会使错误的视觉效果无效。尝试在对象类中声明全局变量以包含装饰器实例,覆盖装饰元素的 OnApplyTemplate 方法,并通过 FindName 方法调用将全局变量与模板中的装饰器实例连接。类似于: myDecorator = Template.FindName("PART_decorator", this) as MyDecoratorType (请注意,在这种情况下,xaml 模板中的装饰器应具有定义为“PART_decorator”的 x:Name)。

之后,您可以在代码中的适当位置针对装饰器实例调用 InvalidateVisual()。

于 2009-03-30T15:01:46.077 回答