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

Я пишу элемент управления WPF, который подклассы кнопки. Затем я предоставляю стиль по умолчанию в Themesgeneric.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>

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

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

спасибо!

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

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

<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>

4 ответов


вы можете просто определить сеттеры в своем стиле для двух рассматриваемых свойств.

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

<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}" />

при объявлении свойства зависимостей для элементов управления вы также объявляете значение по умолчанию как UIPropertyMetadata

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

  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));

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


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

<Button x:Key="DefaultButton"/>

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

<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, я установил черный цвет в фоновое значение по умолчанию.