Je suis à la recherche d'un moyen simple pour supprimer la duplication dans mon code WPF. Le code ci-dessous est un feu de signalisation simple avec 3 feux - Red
, Amber
, Green
. Il est lié à un ViewModel qui possède une propriété enum State
prenant une de ces 3 valeurs.Comment paramétrer WPF Style?
Le code déclarant 3 ellipses est très duplicatif. Maintenant, je veux ajouter une animation pour que chaque lumière disparaisse et disparaisse - les styles deviendront encore plus gros et la duplication s'aggravera.
Est-il possible de paramétrer le style avec les arguments State
et Color
afin que je puisse avoir un seul style dans les ressources décrivant le comportement d'une lumière et l'utiliser 3 fois - pour les lumières 'Rouge', 'Ambre' et 'Vert' ?
<UserControl.Resources>
<l:TrafficLightViewModel x:Key="ViewModel" />
</UserControl.Resources>
<StackPanel Orientation="Vertical" DataContext="{StaticResource ViewModel}">
<StackPanel.Resources>
<Style x:Key="singleLightStyle" TargetType="{x:Type Ellipse}">
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stroke" Value="Black" />
<Setter Property="Height" Value="{Binding Width, RelativeSource={RelativeSource Self}}" />
<Setter Property="Width" Value="60" />
<Setter Property="Fill" Value="LightGray" />
</Style>
</StackPanel.Resources>
<Ellipse>
<Ellipse.Style>
<Style TargetType="{x:Type Ellipse}" BasedOn="{StaticResource singleLightStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="Red">
<Setter Property="Fill" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<Ellipse>
<Ellipse.Style>
<Style TargetType="{x:Type Ellipse}" BasedOn="{StaticResource singleLightStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="Amber">
<Setter Property="Fill" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<Ellipse>
<Ellipse.Style>
<Style TargetType="{x:Type Ellipse}" BasedOn="{StaticResource singleLightStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="Green">
<Setter Property="Fill" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
</StackPanel>
J'ai pensé à créer un contrôle séparé, mais j'espérais qu'il y aurait un autre moyen d'éliminer la duplication. Merci d'avoir répondu! –