Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
SliderDragFromTrackBehavior.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Windows;
5 using System.Windows.Controls;
6 using System.Windows.Controls.Primitives;
7 using System.Windows.Input;
8 using System.Windows.Interactivity;
9 
10 using SiliconStudio.Presentation.Extensions;
11 
12 namespace SiliconStudio.Presentation.Behaviors
13 {
14  public class SliderDragFromTrackBehavior : Behavior<Slider>
15  {
16  private bool trackMouseDown;
17  private Track track;
18 
19  protected override void OnAttached()
20  {
21  base.OnAttached();
22  AssociatedObject.AddHandler(UIElement.PreviewMouseLeftButtonDownEvent, (MouseButtonEventHandler)TrackMouseEvent, true);
23  AssociatedObject.AddHandler(UIElement.PreviewMouseLeftButtonUpEvent, (MouseButtonEventHandler)TrackMouseEvent, true);
24  AssociatedObject.Initialized += SliderInitialized;
25  }
26 
27  protected override void OnDetaching()
28  {
29  AssociatedObject.Initialized -= SliderInitialized;
30  AssociatedObject.RemoveHandler(UIElement.PreviewMouseLeftButtonDownEvent, (MouseButtonEventHandler)TrackMouseEvent);
31  AssociatedObject.RemoveHandler(UIElement.PreviewMouseLeftButtonUpEvent, (MouseButtonEventHandler)TrackMouseEvent);
32  if (track != null && track.Thumb != null)
33  {
34  track.Thumb.MouseEnter -= MouseEnter;
35  }
36  base.OnDetaching();
37  }
38 
39  private void SliderInitialized(object sender, EventArgs e)
40  {
41  AssociatedObject.ApplyTemplate();
42 
43  track = AssociatedObject.FindVisualChildOfType<Track>();
44  if (track == null || track.Name != "PART_Track")
45  throw new InvalidOperationException("The associated slider must have a Track child named 'PART_Track'");
46  track.Thumb.MouseEnter += MouseEnter;
47  AssociatedObject.Initialized += SliderInitialized;
48  }
49 
50  private void TrackMouseEvent(object sender, MouseButtonEventArgs e)
51  {
52  if (e.ChangedButton == MouseButton.Left)
53  trackMouseDown = e.ButtonState == MouseButtonState.Pressed;
54  }
55 
56  private void MouseEnter(object sender, MouseEventArgs e)
57  {
58  if (trackMouseDown)
59  {
60  var args = new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left) { RoutedEvent = UIElement.MouseLeftButtonDownEvent };
61  track.Thumb.RaiseEvent(args);
62  trackMouseDown = false;
63  }
64  }
65  }
66 }
MouseButton
Mouse buttons.
Definition: MouseButton.cs:10