Как заменить часть ControlTemplate во время выполнения в Silverlight 3?
Я пишу пользовательский элемент управления, который использует шаблон, определенный в разделе ресурсов моего XAML, и я хотел бы заменить одну или несколько частей шаблона в экземпляре моего элемента управления во время выполнения.
Например, если в шаблоне элемента управления есть деталь с именем "ActivePart", как заменить FrameworkElement элемента ActivePart в экземпляре элемента управления новым FrameworkElement?
Я понимаю, что свойство Control.Template доступно для записи, но я бы предпочел найти способ заменить определенную часть этого шаблона, а не создавать совершенно новую, хотя решение, которое редактирует существующий шаблон путем замены соответствующей именованной части, быть приемлемым.
Я использую C# и должен делать это во время выполнения, используя любой FrameworkElement, так что я не ищу решения или предложения на основе XAML, спасибо!
PS Мне известно, что GetTemplateChild() возвращает FrameworkElement для именованной части шаблона в экземпляре элемента управления, но я не понимаю, как это помогает мне заменить эту часть новым FrameworkElement.
1 ответ
Я думаю, я упустил очевидное!
После вызова OnApplyTemplate для вашего производного элемента управления VisualTreeHelper.GetChild (this, 0) вернет корневой объект визуального дерева экземпляра шаблона, из которого вы можете использовать коллекцию Children (если шаблон вашего элемента управления является производным от Panel, например Canvas, Сетка и т. Д.) Для добавления / удаления / изменения любых дочерних частей шаблона в соответствии с вашим сердцем.
Перед вызовом OnApplyTemplate для элемента управления не существует визуального дерева, и VisualTreeHelper.GetChildrenCount возвращает 0.