Подтвердить что ты не робот

Как установить контрольный шаблон в коде?

У меня это в XAML

<ControlTemplate TargetType="{x:Type Button}">
    <Image ...>
</ControlTemplate>

Я хочу добиться этого в коде С#. Как я могу достичь этого?

ControlTemplate ct = new ControlTemplate();..
Image img = new Image();..

Теперь, как назначить шаблон Image to Control? Можем ли мы это сделать или я не вижу здесь какой-либо концепции?

4b9b3361

Ответ 1

Создание шаблона в 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, ...);

Кроме того, о (ранее) принятом ответе и цитированном материале:

Установка контрольной метки программно - это просто XAML, потому что мы должны использовать Класс XamlReader.

Это утверждение неверно, мы не "должны".


Если я назначаю шаблоны во время выполнения, я определяю их как ресурс, который я могу загрузить, если мне это нужно.


Изменить: В соответствии с документацией FrameworkElementFactory устарела:

Этот класс является устаревшим способом программного создания шаблонов, которые являются подклассами FrameworkTemplate, такими как ControlTemplate или DataTemplate; не все функциональные возможности шаблона доступны при создании шаблона с использованием этого класса. Рекомендуемым способом программного создания шаблона является загрузка XAML из строки или потока памяти с использованием метода Load класса XamlReader.

Интересно, является ли эта рекомендация такой хорошей идеей. Лично я по-прежнему буду определять шаблон в качестве ресурса в XAML, если я могу избежать его с помощью строк и XamlReader.

Ответ 2

http://www.eggheadcafe.com/sample-code/SilverlightWPFandXAML/73fdb6a2-6044-4c43-8766-afa12618ddc1/set-controltemplate-programmatically.aspx

Установка контрольной метки программно - это просто XAML, потому что мы должны использовать Класс XamlReader. Например, здесь код для установки шаблона кнопки, предполагая, что мы хотим установить после того, как он загружен.

private void Button_Loaded(object sender, RoutedEventArgs e) {
    var button = sender as Button;
    string template =
        "<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
            TargetType=\"Button\">" +
            "<Border>" +
                 "<ContentPresenter/>" +
            "</Border>" +
        "</ControlTemplate>";
    button.Template = (ControlTemplate)XamlReader.Parse(template);
}

Поскольку мы использовали строку для указания код XAML для шаблона, мы можем используйте метод анализа XamlReader. XamlReader также имеет метод Load, который в основном используется для потоков или XAML или XML-считыватели. Обратите внимание, что мы должны включать пространство имен XML http://schemas.microsoft.com/winfx/2006/xaml/presentationпотому что ControlTemplate, Border, и другие элементы управления, которые нам нужны, определены там. Если бы мы не включили его, мы встретить исключение во время выполнения. В принципе, мы должны пространства имен, необходимые для шаблона.

Ответ 3

Если вам нужно изменить изображение кнопки, тогда вы можете сделать одно.
 1. Создайте свойство зависимостей, которое будет отображаться, когда вы хотите изменить изображение (bool), или, может быть, вы можете создать перечисление, которое имеет все возможные изображения.  2. Enum Images {Image1 = 0, Image2 = 1, Image2 = 3}. Создайте свойство зависимостей "CurrentButtonImage" этого типа, которое будет связано с кнопкой.

Теперь в XAML используйте это в шаблоне кнопки  

В свойстве Change CurrentButtonImage обновляет изображение кнопки (в коде позади) с помощью

CurrentImagePropertyChangedhandler (....,...)
{
Переключатель (CurrentButtonImage)
{
case "Image1":
this._ButtonImage.Fill = (DrawingBrush) csd.FindResource( "Image1DrawingBrush" );