Question

J'écris un contrôle WPF qui sous-classe un Button.Je fournis ensuite un style par défaut dans Themes\generic.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>

J'aimerais que l'utilisateur ait la possibilité de modifier l'arrière-plan du contrôle, mais s'il ne le fait pas, j'aimerais fournir une valeur par défaut.Comment fait-on ça?

Quand je le fais comme dans le code publié, Background et BorderBrush sont nuls (= inexistants) à moins que l'utilisateur ne les spécifie explicitement (ce qui oblige effectivement l'utilisateur à toujours fournir une certaine valeur), mais les contrôles Windows standard (comme Button) fournissent un aspect par défaut , qui peut toujours être personnalisé par l'utilisateur.Comment faire cela sous mon contrôle ?

Merci!

Solution de Michael Morton :

Vous pouvez fournir des valeurs par défaut en tant que setters 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>

Usage:

<StackPanel>
    <TestTemplate:MyButton Background="Blue">Explicitly blue</TestTemplate:MyButton>
    <TestTemplate:MyButton>Naturally red</TestTemplate:MyButton>
</StackPanel>
Était-ce utile?

La solution

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

Par exemple, certaines 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"/>

Ensuite, dans la définition de votre style:

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

Autres conseils

<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 corde seccond, je définir la couleur noire à la valeur par défaut Arrière-plan.

Lorsque vous déclarez une propriété de dépendance pour vos contrôles, vous déclarez également la valeur par défaut comme UIPropertyMetadata

cette propriété est par défaut Brushes.Red, comme vous pouvez le voir sur 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 procéder consiste à définir la couleur par défaut dans le constructeur de votre contrôle personnalisé, car le constructeur est toujours appelé avant que les propriétés ne soient définies par l'utilisateur. Si celui-ci ne parvient pas à les définir, elles seront par défaut les vôtres.En fait, ils seront toujours définis par vous et tout paramètre utilisateur remplacera le vôtre.Ceci est particulièrement efficace si vous souhaitez définir les propriétés telles que l'arrière-plan que vous ne créez pas réellement, celles qui proviennent des classes de base dont vous héritez.

Il est également possible de style par défaut « hériter » de l'élément de Button en créant par exemple l'échantillon 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top