Je crée un style qui modifie un ControlTemplate d'un bouton (il ajoute en fait une flèche sur la droite, de sorte que le bouton ressemble à un bouton déroulant (qui manque dans wpf)). À l'intérieur du modèle, j'ai mis le bouton actuel (parce que j'ai besoin que le résultat soit comme le bouton - je pourrais changer seulement ContentTemplate, mais j'ai besoin d'afficher le contenu réel avec la flèche, et de mettre ContentsPresenter dans ContentTemplate overflow - wpf étend juste le modèle dans le présentateur et s'allonge encore et encore), avec la flèche.WPF: Comment avoir un modèle de bouton personnalisé qui utilise l'arrière-plan du bouton système par défaut?
Mon problème est que je voudrais que l'utilisateur puisse changer l'arrière-plan du bouton, donc j'ai besoin de lier Background="{TemplateBinding Background}"
. Avec ceci, l'utilisateur devrait toujours fournir l'arrière-plan, sinon ce serait null. Pour éviter cela, je comprends que je dois fournir une valeur par défaut pour l'arrière-plan, donc j'ai ajouté <Setter Property="Background" Value="default Background goes here"/>
La question est, quelle devrait être une valeur de ce setter? Je suppose que les styles intégrés de wpf sont chargés automatiquement pour chaque application, et j'ai regardé dans aero.normalcolor.xaml, où ils fournissent ButtonNormalBackground
style, et plus tard l'utiliser comme style de bouton par défaut <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
(aero.normalcolor.xaml, ligne 47).
Exactement ce que je voulais, cependant, lorsque j'utilise ce setter, la ressource statique est introuvable. Je l'ai ensuite changé en DynamicResource, mais dans ce cas, l'arrière-plan du bouton reste transparent - le ButtonNormalBackground n'est pas utilisé!
Comment est-ce que je devrais fournir l'aspect du bouton du système comme valeur par défaut? Je vous remercie!
PS: DTTO pour BorderBrush, BorderThickness - Bon sang, il semble que je ne suis pas autorisé les trucs que les auteurs WPF utilisent tout le temps:/
Mon style:
<Style TargetType="{x:Type ToggleButton}" x:Key="DropDownArrowStyle">
<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
<Setter Property="ToggleButton.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<ToggleButton
x:Name="PART_ToggleButton"
Margin="{TemplateBinding Margin}"
Padding="{TemplateBinding Padding}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
IsEnabled="{TemplateBinding IsEnabled}"
IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
ContextMenu="{TemplateBinding ContextMenu}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Foreground="{TemplateBinding Foreground}"
FocusVisualStyle="{TemplateBinding FocusVisualStyle}"
ClickMode="{TemplateBinding ClickMode}"
>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentPresenter
x:Name="ButtonContentPresenter"
HorizontalAlignment="Left"
VerticalAlignment="Stretch"
Margin="{TemplateBinding Padding}"
Content="{TemplateBinding Content}"
Grid.Column="0"
/>
<Border
x:Name="PART_DownArrowBorder"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="Transparent"
Focusable="False"
Grid.Column="1"
>
<Path
Focusable="False"
x:Name="PART_DownArrow"
Data="M 3,0 L 6.5,4 L 10,0"
Width="12"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Fill="Black" SnapsToDevicePixels="True"
>
</Path>
</Border>
</Grid>
</ToggleButton>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
connexes: http://stackoverflow.com/questions/628483/how-can-i-set-a-wpf-controls-color-to- un-système-couleur-programmatique-donc-que-je –