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

WPF ControlTemplate: как указать значение по умолчанию для TemplateBinding?

Я пишу элемент управления WPF, который подклассифицирует кнопку. Затем я предоставляю стиль по умолчанию в Themes\generic.xaml, который выглядит так (упрощенный):

<Style TargetType="{x:Type WPFControls:MyButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type WPFControls:MyButton}">
                <Button 
                    x:Name="PART_Button"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

Когда я делаю это как в опубликованном коде, Background и BorderBrush имеют значение null (= nonexistent), если пользователь явно не указывает их (что фактически заставляет пользователя всегда предоставлять некоторое значение), но стандартные элементы управления Windows (например, Button) предоставляют внешний вид, который по-прежнему может быть настроен пользователем. Как это сделать под моим контролем?

Спасибо!

Решение Майкла Мортона:

Вы можете указать настройки по умолчанию в стиле:

<Style TargetType="{x:Type TestTemplate:MyButton}">
    <Setter Property="Background" Value="Red" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TestTemplate:MyButton}">
                <Button 
                    x:Name="PART_Button"
                    IsEnabled="{TemplateBinding IsEnabled}"
                    Content="{TemplateBinding Content}"
                    Background="{TemplateBinding Background}"
                    />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Использование:

<StackPanel>
    <TestTemplate:MyButton Background="Blue">Explicitly blue</TestTemplate:MyButton>
    <TestTemplate:MyButton>Naturally red</TestTemplate:MyButton>
</StackPanel>
4b9b3361

Ответ 1

Вы можете просто определить сеттеры для вашего стиля для двух свойств, о которых идет речь.

Например, некоторые общие определения:

<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
    <GradientStop Color="#F3F3F3" Offset="0"/>
    <GradientStop Color="#EBEBEB" Offset="0.5"/>
    <GradientStop Color="#DDDDDD" Offset="0.5"/>
    <GradientStop Color="#CDCDCD" Offset="1"/>
</LinearGradientBrush>

<SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>

Затем в вашем определении стиля:

<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}" />
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}" />

Ответ 2

Когда вы объявляете свойство зависимостей для своих элементов управления, вы также объявляете значение по умолчанию как UIPropertyMetadata​​p >

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

  public Brush MyBrush {
     get { return (Brush)GetValue(MyBrushProperty); }
     set { SetValue(MyBrushProperty, value); }
  }

  public static readonly DependencyProperty MyBrushProperty =
      DependencyProperty.Register("MyBrush", typeof(Brush), typeof(MyQsFeature), new UIPropertyMetadata(Brushes.Red));

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

Ответ 3

Также возможно "наследовать" стиль по умолчанию для элемента Button, создавая экземпляр экземпляра и ссылаясь на его свойства:

<Button x:Key="DefaultButton"/>

<Style TargetType="{x:Type TestTemplate:MyButton}">
        <Setter Property="Background"
                Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>

Ответ 4

<Style TargetType="{x:Type WPFControls:MyButton}">
    <Setter Property="Background" Value="Black">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type WPFControls:MyButton}">
                <Button 
                    x:Name="PART_Button"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Обратите внимание на строку seccond, я установил черный цвет в значение фона по умолчанию.