Bonjour,
Je suis en train d'essayer de développer un template de manière à ce qu'une CheckBox soit représentée sous la forme d'un bouton à 3 états (style interrupteur avec en plus un état indéfini), de manière à pouvoir représenter l'état d'une alimentation (indéfini, ON ou OFF).
Du coup, j'ai créé mon template, mais j'ai du mal avec le trigger qui doit capter mon clic et modifier l'apparence de la checkbox. J'arrive à capter le MouseEnter, mais pas le MouseLeftButtonDown.
Voici mon XAML :
Je me dis que mon contrôle n'arrive pas à capter mon évènement clic parce qu'il est sur un DockPanel contenant d'autres composants et quand je clique je ne sais pas si les composants fils font remonter l'info à mon DockPanel racine.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 <ControlTemplate x:Key="ThreeStateButtonControlTemplate" TargetType="{x:Type CheckBox}"> <!-- Ressources définissant l'animation lors du clic --> <ControlTemplate.Resources> <Storyboard x:Key="OnMouseClick_UndefinedToOn"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="buttonGrid" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"> <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="-45" /> </DoubleAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="OnMouseClick_OnToOff"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="buttonGrid" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(RotateTransform.Angle)"> <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="45" /> </DoubleAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="OnMouseClick_OffToOn"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="buttonGrid" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[4].(RotateTransform.Angle)"> <SplineDoubleKeyFrame KeyTime="00:00:00.2" Value="-45" /> </DoubleAnimationUsingKeyFrames> </Storyboard> </ControlTemplate.Resources> <!-- Composant en lui-même : DockPanel contenant 3 labels et une Grid contenant elle-même des ellipses--> <DockPanel x:Name="buttonDockPanel" Margin="15"> <Label x:Name="undefinedLabel" Content="-" HorizontalAlignment="Center" DockPanel.Dock="Top" /> <Label x:Name="onLabel" Foreground="Green" Content="ON" DockPanel.Dock="Left" /> <Label x:Name="offLabel" Foreground="Red" Content="OFF" DockPanel.Dock="Right" /> <Grid x:Name="buttonGrid" Width="Auto" Height="Auto" RenderTransformOrigin="0.5,0.5" DockPanel.Dock="Bottom"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.RenderTransform> <TransformGroup> <ScaleTransform ScaleX="1" ScaleY="1" /> <SkewTransform AngleX="0" AngleY="0" /> <RotateTransform x:Name="rotateUndefinedToOn" CenterX="0.5" CenterY="0.5" /> <RotateTransform x:Name="rotateOnToOff" CenterX="0.5" CenterY="0.5" /> <RotateTransform x:Name="rotateOffToOn" CenterX="0.5" CenterY="0.5" /> <TranslateTransform X="0" Y="0" /> </TransformGroup> </Grid.RenderTransform> <Ellipse x:Name="mainEllipse" HorizontalAlignment="Center" Margin="5" Width="48" Height="48" Grid.RowSpan="2" Grid.ColumnSpan="3" Fill="{StaticResource toolBarBlackGradient}" Stroke="{StaticResource strokeGradientBrush}" StrokeThickness="2" /> <Ellipse x:Name="littleEllipse" HorizontalAlignment="Center" Width="8" Height="8" Grid.Column="1" Fill="White" Stroke="{StaticResource strokeGradientBrush}" StrokeThickness="2" /> </Grid> </DockPanel> <!-- Gestion des évènements --> <ControlTemplate.Triggers> <EventTrigger RoutedEvent="Control.MouseLeftButtonDown"> <EventTrigger.Actions> <BeginStoryboard Storyboard="{StaticResource OnMouseClick_UndefinedToOn}" /> </EventTrigger.Actions> </EventTrigger> </ControlTemplate.Triggers> </ControlTemplate>
Est-ce que quelqu'un voit comment faire ?
Merci d'avance.
Partager