Dans WPF, comment appliquer plusieurs styles à FrameworkElement
? Par exemple, j'ai un contrôle qui a déjà un style. J'ai aussi un style distinct que je voudrais ajouter sans faire sauter le premier. Les styles ont des TargetTypes différents, donc je ne peux pas simplement les prolonger l'un avec l'autre.
Réponses
Trop de publicités?Je pense que la réponse simple est que vous ne pouvez pas le faire (au moins dans cette version de WPF) ce que vous essayez de faire.
C'est, pour tout élément particulier un seul Style peut être appliqué.
Cependant, comme d'autres l'ont indiqué ci-dessus, peut-être que vous pouvez utiliser BasedOn
pour vous aider. Découvrez le morceau suivant du xaml libre. En lui, vous verrez que j'ai un style de base qui est la définition d'une propriété qui existe sur la classe de base de l'élément que je veux appliquer deux styles. Et, dans le second style est basé sur le style de base, j'ai mis une autre propriété.
Ainsi, l'idée ici ... si vous pouvez en quelque sorte séparer les propriétés que vous souhaitez définir ... selon la hiérarchie d'héritage de l'élément que vous souhaitez définir plusieurs styles sur ... vous pourriez avoir une solution de contournement.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="baseStyle" TargetType="FrameworkElement">
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
<Style TargetType="Button" BasedOn="{StaticResource baseStyle}">
<Setter Property="Content" Value="Hello World"/>
</Style>
</Page.Resources>
<Grid>
<Button Width="200" Height="50"/>
</Grid>
</Page>
Espérons que cette aide.
Note:
Une chose en particulier à noter. Si vous modifiez l' TargetType
dans le second style (dans la première série de xaml ci-dessus) ButtonBase
, les deux Styles ne sont pas appliquées. Cependant, découvrez le code xaml suivant ci-dessous pour contourner cette restriction. Fondamentalement, cela signifie que vous devez donner le Style d'une clé et de référence avec cette clé.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="baseStyle" TargetType="FrameworkElement">
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
<Style x:Key="derivedStyle" TargetType="ButtonBase" BasedOn="{StaticResource baseStyle}">
<Setter Property="Content" Value="Hello World"/>
</Style>
</Page.Resources>
<Grid>
<Button Width="200" Height="50" Style="{StaticResource derivedStyle}"/>
</Grid>
</Page>
Bea Stollnitz a un bon article sur l'utilisation d'une extension de balisage pour cela, sous la rubrique "Comment définir plusieurs styles dans WPF?"
Mais vous pouvez étendre depuis un autre .. jetez un oeil à la propriété BasedOn
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="3" />
</Style>
<Style x:Key="AlwaysVerticalStyle" TargetType="TextBlock"
BasedOn="{StaticResource {x:Type TextBlock}}">
<Setter Property="VerticalAlignment" Value="Top" />
</Style>
Cela est possible en créant une classe d'assistance à utiliser et envelopper vos styles. CompoundStyle mentionné ici montre comment le faire. Il y a plusieurs façons, mais la plus simple est de procéder comme suit:
<TextBlock Text="Test"
local:CompoundStyle.StyleKeys="headerStyle,textForMessageStyle,centeredStyle"/>
J'espère que cela pourra aider.