WPF ControlTemplate: comment fournir une valeur par défaut pour TemplateBinding?

j'écris un contrôle WPF qui sous-classe un bouton. Je fournis alors un style par défaut dans Themesgeneric.xaml, qui ressemble à ceci (simplifié):

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

je voudrais que l'utilisateur ait la possibilité de changer l'arrière-plan du contrôle, mais s'il ne l'est pas, j'aimerais fournir la valeur par défaut. Comment dois-je faire?

quand je le fais comme dans le code Posté, le Background et BorderBrush est nul (=inexistant) à moins que l'utilisateur ne les spécifie explicitement (ce qui force effectivement l'utilisateur à toujours fournir une certaine valeur), mais les commandes standard de windows (comme le bouton) fournissent un aspect par défaut, qui peut encore être personnalisé par l'utilisateur. Comment faire cela dans ma commande?

Merci!

Solution par Michael Morton:

Vous pouvez fournir des valeurs par défaut que les poseurs dans le style:

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

Utilisation:

<StackPanel>
    <TestTemplate:MyButton Background="Blue">Explicitly blue</TestTemplate:MyButton>
    <TestTemplate:MyButton>Naturally red</TestTemplate:MyButton>
</StackPanel>
22
demandé sur Dave Clemmer 2009-11-25 02:14:54

4 réponses

vous pouvez simplement définir des setters sur votre style pour les deux propriétés en question.

par exemple, quelques définitions générales:

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

Puis, dans votre définition du style:

<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}" />
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}" />
15
répondu Michael Morton 2009-11-25 00:26:33

lorsque vous déclarez une propriété de dépendance pour vos contrôles, vous déclarez aussi la valeur par défaut comme "Unipropertymetadata"

cette propriété est par défaut des brosses.Rouge, comme vous pouvez le voir dans la dernière ligne.

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

l'autre façon de le faire est de définir la couleur par défaut dans le constructeur de votre contrôle personnalisé, car le constructeur est toujours appelé avant que n'importe quelle propriété ne soit définie par l'utilisateur si l'utilisateur ne parvient pas à les définir ils seraient par défaut à la vôtre. En fait, ils seraient toujours obtenir définie par vous, et puis n'importe quel utilisateur paramètre remplace la vôtre. C'est esp efficace si vous voulez définir les propriétés telles que Background que vous ne créez pas, celles qui proviennent de vos classes de base dont vous héritez.

2
répondu Aran Mulholland 2009-11-24 23:29:38

il est également possible d'hériter du style par défaut de Button de l'élément de la création de l'échantillon de l'instance et le référencement de ses propriétés:

<Button x:Key="DefaultButton"/>

<Style TargetType="{x:Type TestTemplate:MyButton}">
        <Setter Property="Background"
                Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>
2
répondu Marcin Wisnicki 2012-03-26 12:20:06
<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>

faites attention sur la chaîne seccond, j'ai mis la couleur Noire à la valeur par défaut de L'arrière-plan.

1
répondu Marat Batalandabad 2013-11-17 02:10:45