Создание шаблона в codebehind не очень хорошая идея, теоретически это можно сделать, определив ControlTemplate.VisualTree
, который является FrameworkElementFactory
.
ControlTemplate template = new ControlTemplate(typeof(Button));
var image = new FrameworkElementFactory(typeof(Image));
template.VisualTree = image;
Назначение свойств очень обходное, так как вам нужно использовать SetValue
и SetBinding
:
image.SetValue(Image.SourceProperty, ...);
Кроме того, о (ранее) принятом ответе и цитируемом материале:
Настройка шаблона ControlTemplate
программно так же, как с помощью
XAML, потому что мы должны использовать
Класс XamlReader.
Это утверждение просто неверно, мы «не обязаны» .
Если я назначаю шаблоны во время выполнения, я определяю их как ресурс, который я могу загрузить, если мне это нужно.
Редактировать: Согласно документации FrameworkElementFactory
устарело:
Этот класс является устаревшим способом программного создания шаблонов, которые являются подклассами FrameworkTemplate, такими как ControlTemplate или DataTemplate; не все функциональные возможности шаблона доступны при создании шаблона с использованием этого класса. Рекомендуемый способ программного создания шаблона - загрузить XAML из строки или потока памяти, используя метод Load класса XamlReader.
Интересно, хорошая ли эта рекомендация? Лично я бы все же пошел с определением шаблона как ресурса в XAML, если бы я мог избежать этого с помощью строк и XamlReader
.