2009-11-24 5 views
20

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

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

ответ

15

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

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

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

Прохладный, вот что я хотел знать.Я добавил ваше решение к вопросу. Благодаря! –

2

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

По умолчанию это свойство 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, которые вы на самом деле не создаете, те, которые исходят из ваших базовых классов, на которые вы наследуете.

+1

Спасибо, но я использую прикрепленное свойство от предка, поэтому трюк со значением по умолчанию невозможен. Что касается установки его в конструкторе - это запись xaml в коде (что не обязательно), и оно не может быть изменено с помощью шаблона, поэтому я не думаю, что это так, как это делают средства управления Microsoft. –

2

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

<Button x:Key="DefaultButton"/> 

<Style TargetType="{x:Type TestTemplate:MyButton}"> 
     <Setter Property="Background" 
       Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" /> 
</Style> 
1
<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, я установил черный цвет в значение фона по умолчанию.

 Смежные вопросы

  • Нет связанных вопросов^_^