Bonjour,
J'était en train de créer un slider et pendant que je manipulais ces évènements tel que PreviewMouseDown ou PreviewMouseUp, j'ai pu rencontrer quelques problèmes ou du moins des comportements auquel je ne m'attendais pas. Avant de commencer à expliquer, je précise que j'utilise AttachedCommandBehavior pour lier des Command ou Action aux évènements de mes éléments, peut être que cela peut changer quelque chose. Pour faire mes test j'ai fait un petit bout de code tout bête, j'ai une ViewModel qui a un propriété bool (appellé IsChanging par exemple), par défaut à false. Quand la souris est Down sur le slider, il passe à True et quand elle up cela repasse à False. J'ai mis à côté un textblock qui affiche la propriété.
Donc la chose qui me chiffonne a été pendant l'utilisation de PreviewMouseDown et PreviewMouseUp sur mon slider. Quand je clique avec le bouton gauche de la souris directement sur le Thumb (c'est à dire le bouton du slider qui permet de faire changer la valeur) la valeur de mon bool est changé correctement, il en est de même avec le bouton droit. Jusque là tout va bien. Par contre quand je clique avec le bouton gauche de la souris directement sur une partie de slider (c'est à dire sur un des RepeatButton), la valeur du bool ne change pas, les évènements ne semble pas être appelé pour le slider ou alors stoppé avant de l'atteindre. Si je fait la même manipulation avec le bouton droit, là la valeur du bool change bien, par contre chose étrange là le Thumb ne bouge pas de place.
Concernant les évènements que ce soit PreviewMouseDown ou MouseDown tout court le résultat est le même, en pire car quand je clique avec la souris gauche la mon bool ne change plus du tout.
Je ne pense pourtant avoir rien fait de particulier avec le slider, j'ai changé son Style et son Template, mais j'ai repris exactement l'exemple présent sur msdn pour le faire (http://msdn.microsoft.com/fr-fr/library/ms753256.aspx). J'ai pas fait de changement mirobolant, j'ai juste mis de simple border. Peut être après ai-je oublié un truc primordial dans le Template mais je ne pense pas. La partie code C# elle est très basique, donc je ne pense pas que l'erreur vienne de là, c'est juste une propriété qui change de valeur et qui l'expose.
Je vous met surtout le code XAML du style de mon slider et celui du slider lui même:
Style du slider:
Le slider:
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 <Style x:Key="SliderBeforeRepeatStyle" TargetType="{x:Type RepeatButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RepeatButton}"> <Border Background="{StaticResource SliderButtonBackground}" BorderBrush="{StaticResource SliderButtonBorder}" BorderThickness="0 0 0 1" CornerRadius="6 0 0 6"> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="SliderAfterRepeatStyle" TargetType="{x:Type RepeatButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RepeatButton}"> <Border Background="Transparent" BorderBrush="{StaticResource SliderInnerBorder}" BorderThickness="0 1 0 0" CornerRadius="0 6 6 0"></Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="SliderThumbStyle" TargetType="{x:Type Thumb}"> <Setter Property="SnapsToDevicePixels" Value="true"/> <Setter Property="OverridesDefaultStyle" Value="true"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Thumb}"> <Grid> <Ellipse Fill="White" Width="9" Height="9" Stroke="Black" StrokeThickness="1"></Ellipse> <Ellipse x:Name="BlackEllipse" Fill="Black" Width="3" Height="3" Visibility="Hidden"></Ellipse> </Grid> <ControlTemplate.Triggers> <EventTrigger RoutedEvent="Thumb.PreviewMouseDown"> <BeginStoryboard> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="BlackEllipse" Duration="0:00:00"> <DiscreteObjectKeyFrame KeyTime="0:00:00" Value="{x:Static Visibility.Visible}"></DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger> <EventTrigger RoutedEvent="Thumb.PreviewMouseUp"> <BeginStoryboard> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="BlackEllipse" Duration="0:00:00"> <DiscreteObjectKeyFrame KeyTime="0:00:00" Value="{x:Static Visibility.Hidden}"></DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="SliderStyle" TargetType="{x:Type Slider}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Border Height="11" CornerRadius="6" Background="{StaticResource SliderBackground}" BorderBrush="{StaticResource SliderTopBorder}" BorderThickness="1 1 1 0"> <Border CornerRadius="6" BorderBrush="{StaticResource SliderBottomBorder}" BorderThickness="0 0 0 1"> <Track Name="PART_Track"> <Track.DecreaseRepeatButton> <RepeatButton Style="{StaticResource SliderBeforeRepeatStyle}"></RepeatButton> </Track.DecreaseRepeatButton> <Track.Thumb> <Thumb Style="{StaticResource SliderThumbStyle}"></Thumb> </Track.Thumb> <Track.IncreaseRepeatButton> <RepeatButton Style="{StaticResource SliderAfterRepeatStyle}"></RepeatButton> </Track.IncreaseRepeatButton> </Track> </Border> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
En espérant que vous arriverez à m'éclairer sur ce problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <Slider Grid.Column="1" Style="{StaticResource SliderStyle}" IsMoveToPointEnabled="True" Maximum="{Binding Path=Duration, Mode=OneWay}" Value="{Binding Path=CurrentPosition, Mode=TwoWay}"> <acb:CommandBehaviorCollection.Behaviors> <acb:BehaviorBinding Event="PreviewMouseDown" Action="{Binding EnablePositionChange}"></acb:BehaviorBinding> <acb:BehaviorBinding Event="PreviewMouseUp" Action="{Binding DisablePositionChange}"></acb:BehaviorBinding> </acb:CommandBehaviorCollection.Behaviors> </Slider>
Je vous remercie d'avance pour votre aide.
Partager