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

StackOverflow https://stackoverflow.com/questions/1793611

Вопрос

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

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

Когда я делаю это так, как в опубликованном коде, фон и пограничный номер являются нулевыми (= не существующими), если только пользователь явно не указал их (что эффективно заставляет пользователя всегда предоставлять некоторое значение), но стандартные элементы управления 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>
Это было полезно?

Решение

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

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

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

Другие советы

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

Когда вы объявляете свойство зависимости для ваших элементов управления, вы также объявите дефолт как UipropertyMetadata

Это свойство по умолчанию по умолчанию Brushs.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));

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

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

<Button x:Key="DefaultButton"/>

<Style TargetType="{x:Type TestTemplate:MyButton}">
        <Setter Property="Background"
                Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top