Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
WPF:使ControlTemplate中的控件无效_Wpf_Decorator_Controltemplate - Fatal编程技术网

WPF:使ControlTemplate中的控件无效

WPF:使ControlTemplate中的控件无效,wpf,decorator,controltemplate,Wpf,Decorator,Controltemplate,我创建了一个decorator,它在OnRender方法中绘制一些自定义图形。图形取决于包含装饰器的对象的位置。我通过样式通过模板属性设置装饰器。问题是,应用模板时,装饰器的OnRender方法只调用一次。因此,当我更改对象的位置并对该对象调用InvalidateVisual()时,装饰器不会重新呈现 我已通过将对象的模板设置为null,然后将其重置回相同的模板来解决此问题,如下所示: if (myObject.Template != null) { ControlTemplate tmpT

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

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

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

这确实奏效,但我相信这不是应该做的。我遗漏了什么?

我想你可能是在否定错误的视觉效果。 尝试在对象类中声明全局变量以包含装饰器实例,重写装饰元素的OnApplyTemplate方法,并通过FindName方法调用将全局变量连接到模板中的装饰器实例。类似于:myDecorator=Template.FindName(“PART_decorator”,this)作为MyDecoratorType(注意,在本例中,xaml模板中的decorator应该有一个定义为“PART_decorator”的x:Name)

之后,您可以在代码中适当的地方对decorator实例调用InvalidateVisual()