WPF: недействительные элементы управления в ControlTemplate - PullRequest
0 голосов
/ 03 февраля 2009

Я создал декоратор, который рисует некоторую пользовательскую графику в методе OnRender. Графика зависит от положения объекта, содержащего декоратор. Я устанавливаю декоратор через свойство Template через Style. Проблема в том, что метод OnRender декоратора вызывается только один раз при применении шаблона. Поэтому, когда я меняю положение объекта и вызываю InvalidateVisual () для этого объекта, декоратор не перерисовывается.

Мне удалось обойти это, установив для шаблона объекта значение null, а затем сбросив его обратно на тот же шаблон, как этот:

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

Это делает трюк, но я уверен, что это не так, как это должно быть сделано. Чего мне не хватает?

1 Ответ

0 голосов
/ 30 марта 2009

Я полагаю, вы могли бы сделать недействительным визуальное представление. Попробуйте объявить глобальную переменную в вашем классе объектов как экземпляр вашего декоратора, переопределить метод OnApplyTemplate для декорированного элемента и связать глобальную переменную с экземпляром декоратора в шаблоне с помощью вызова метода FindName. Что-то вроде: myDecorator = Template.FindName ("PART_decorator", this) как MyDecoratorType (обратите внимание, что для декоратора в шаблоне xaml должно быть указано x: Name, определенное как "PART_decorator" в этом случае).

После этого вы можете вызывать InvalidateVisual () для экземпляра декоратора, где это уместно в вашем коде.

...