在Silverlight中添加Click及DoubleClick鼠标事件
稍微修改了里面的一点代码,让所有FrameworkElement都可以产生Click及DoubleClick事件。
稍微修改了里面的一点代码,让所有FrameworkElement都可以产生Click及DoubleClick事件。
代码如下:
public class MouseClickManager
1
2 public class MouseClickManager
3 {
4 public event MouseButtonEventHandler Click;
5 public event MouseButtonEventHandler DoubleClick;
6
7 /// <summary>
8 /// Gets or sets a value indicating whether this <see cref="MouseClickManager"/> is clicked.
9 /// </summary>
10 /// <value><c>true</c> if clicked; otherwise, <c>false</c>.</value>
11 private bool Clicked { get; set; }
12
13 /// <summary>
14 /// Gets or sets the control.
15 /// </summary>
16 /// <value>The control.</value>
17 public FrameworkElement Control { get; set; }
18
19 /// <summary>
20 /// Gets or sets the timeout.
21 /// </summary>
22 /// <value>The timeout.</value>
23 public int Timeout { get; set; }
24
25 /// <summary>
26 /// Initializes a new instance of the <see cref="MouseClickManager"/> class.
27 /// </summary>
28 /// <param name="control">The control.</param>
29 public MouseClickManager(FrameworkElement control, int timeout)
30 {
31 this.Clicked = false;
32 this.Control = control;
33 this.Timeout = timeout;
34 }
35
36 /// <summary>
37 /// Handles the click.
38 /// </summary>
39 /// <param name="sender">The sender.</param>
40 /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
41 public void HandleClick(object sender, MouseButtonEventArgs e)
42 {
43 lock(this)
44 {
45 if (this.Clicked) //之前已经得到一个Click,再次得到视为DoubleClick
46 {
47 this.Clicked = false;
48 OnDoubleClick(sender, e);
49 }
50 else //捕获Click事件
51 {
52 this.Clicked = true;
53 //创建线程来对标志位进行置位
54 ParameterizedThreadStart threadStart = new ParameterizedThreadStart(ResetThread);
55 Thread thread = new Thread(threadStart);
56 thread.Start(e);
57 }
58 }
59 }
60
61 /// <summary>
62 /// Resets the thread.
63 /// </summary>
64 /// <param name="state">The state.</param>
65 private void ResetThread(object state)
66 {
67 //就是说超过在第一个Click之后超过间隔时间没有收到第二个Click则认为是Click
68 Thread.Sleep(this.Timeout);
69
70 lock (this)
71 {
72 if (this.Clicked)
73 {
74 this.Clicked = false;
75 OnClick(this, (MouseButtonEventArgs)state);
76 }
77 }
78 }
79
80 /// <summary>
81 /// Called when [click].
82 /// </summary>
83 /// <param name="sender">The sender.</param>
84 /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
85 private void OnClick(object sender, MouseButtonEventArgs e)
86 {
87 MouseButtonEventHandler handler = Click;
88
89 if (handler != null)
90 this.Control.Dispatcher.BeginInvoke(handler, sender, e);
91 }
92
93 /// <summary>
94 /// Called when [double click].
95 /// </summary>
96 /// <param name="sender">The sender.</param>
97 /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
98 private void OnDoubleClick(object sender, MouseButtonEventArgs e)
99 {
100 MouseButtonEventHandler handler = DoubleClick;
101
102 if (handler != null)
103 handler(sender, e);
104 }
105
1
2 public class MouseClickManager
3 {
4 public event MouseButtonEventHandler Click;
5 public event MouseButtonEventHandler DoubleClick;
6
7 /// <summary>
8 /// Gets or sets a value indicating whether this <see cref="MouseClickManager"/> is clicked.
9 /// </summary>
10 /// <value><c>true</c> if clicked; otherwise, <c>false</c>.</value>
11 private bool Clicked { get; set; }
12
13 /// <summary>
14 /// Gets or sets the control.
15 /// </summary>
16 /// <value>The control.</value>
17 public FrameworkElement Control { get; set; }
18
19 /// <summary>
20 /// Gets or sets the timeout.
21 /// </summary>
22 /// <value>The timeout.</value>
23 public int Timeout { get; set; }
24
25 /// <summary>
26 /// Initializes a new instance of the <see cref="MouseClickManager"/> class.
27 /// </summary>
28 /// <param name="control">The control.</param>
29 public MouseClickManager(FrameworkElement control, int timeout)
30 {
31 this.Clicked = false;
32 this.Control = control;
33 this.Timeout = timeout;
34 }
35
36 /// <summary>
37 /// Handles the click.
38 /// </summary>
39 /// <param name="sender">The sender.</param>
40 /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
41 public void HandleClick(object sender, MouseButtonEventArgs e)
42 {
43 lock(this)
44 {
45 if (this.Clicked) //之前已经得到一个Click,再次得到视为DoubleClick
46 {
47 this.Clicked = false;
48 OnDoubleClick(sender, e);
49 }
50 else //捕获Click事件
51 {
52 this.Clicked = true;
53 //创建线程来对标志位进行置位
54 ParameterizedThreadStart threadStart = new ParameterizedThreadStart(ResetThread);
55 Thread thread = new Thread(threadStart);
56 thread.Start(e);
57 }
58 }
59 }
60
61 /// <summary>
62 /// Resets the thread.
63 /// </summary>
64 /// <param name="state">The state.</param>
65 private void ResetThread(object state)
66 {
67 //就是说超过在第一个Click之后超过间隔时间没有收到第二个Click则认为是Click
68 Thread.Sleep(this.Timeout);
69
70 lock (this)
71 {
72 if (this.Clicked)
73 {
74 this.Clicked = false;
75 OnClick(this, (MouseButtonEventArgs)state);
76 }
77 }
78 }
79
80 /// <summary>
81 /// Called when [click].
82 /// </summary>
83 /// <param name="sender">The sender.</param>
84 /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
85 private void OnClick(object sender, MouseButtonEventArgs e)
86 {
87 MouseButtonEventHandler handler = Click;
88
89 if (handler != null)
90 this.Control.Dispatcher.BeginInvoke(handler, sender, e);
91 }
92
93 /// <summary>
94 /// Called when [double click].
95 /// </summary>
96 /// <param name="sender">The sender.</param>
97 /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
98 private void OnDoubleClick(object sender, MouseButtonEventArgs e)
99 {
100 MouseButtonEventHandler handler = DoubleClick;
101
102 if (handler != null)
103 handler(sender, e);
104 }
105
用的时候:
1. 把MouseClickManage.cs类引入到工程中;
2. 用需要获得Click或DoubleClick的FrameworkElement初始化MouseClickManager,并指定时间间隔(200ms挺不错)
3. 在FrameworkElement的MouseLeftButtonUp事件中调用MouseClickManager.HandleClick()方法
代码:
public partial class Page : UserControl
1
2 public partial class Page : UserControl
3 {
4 private MouseClickManager mcm = null;
5
6 public Page()
7 {
8 InitializeComponent();
9 this.Loaded += new RoutedEventHandler(Page_Loaded);
10 }
11
12 void Page_Loaded(object sender, RoutedEventArgs e)
13 {
14 //初始化MouseClickManager
15 this.mcm = new MouseClickManager(this.LayoutRoot, 200);
16 mcm.Click += new MouseButtonEventHandler(mcm_Click);
17 mcm.DoubleClick += new MouseButtonEventHandler(mcm_DoubleClick);
18 this.LayoutRoot.MouseLeftButtonUp += new MouseButtonEventHandler(LayoutRoot_MouseLeftButtonUp);
19 }
20
21 void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
22 {
23 //调用HandleClick方法
24 mcm.HandleClick(sender, e);
25 }
26
27 void mcm_DoubleClick(object sender, MouseButtonEventArgs e)
28 {
29 this.ClickMessage.Text = "Double click!";
30 }
31
32 void mcm_Click(object sender, MouseButtonEventArgs e)
33 {
34 this.ClickMessage.Text = "Click!";
35 }
36
1
2 public partial class Page : UserControl
3 {
4 private MouseClickManager mcm = null;
5
6 public Page()
7 {
8 InitializeComponent();
9 this.Loaded += new RoutedEventHandler(Page_Loaded);
10 }
11
12 void Page_Loaded(object sender, RoutedEventArgs e)
13 {
14 //初始化MouseClickManager
15 this.mcm = new MouseClickManager(this.LayoutRoot, 200);
16 mcm.Click += new MouseButtonEventHandler(mcm_Click);
17 mcm.DoubleClick += new MouseButtonEventHandler(mcm_DoubleClick);
18 this.LayoutRoot.MouseLeftButtonUp += new MouseButtonEventHandler(LayoutRoot_MouseLeftButtonUp);
19 }
20
21 void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
22 {
23 //调用HandleClick方法
24 mcm.HandleClick(sender, e);
25 }
26
27 void mcm_DoubleClick(object sender, MouseButtonEventArgs e)
28 {
29 this.ClickMessage.Text = "Double click!";
30 }
31
32 void mcm_Click(object sender, MouseButtonEventArgs e)
33 {
34 this.ClickMessage.Text = "Click!";
35 }
36