如何让WPF中的button按钮在连续多次点击时都能触发click事件?
- 内容介绍
- 文章标签
- 相关推荐
本文共计521个文字,预计阅读时间需要3分钟。
解决WPF中Button按钮同时多次点击触发click事件的方法如下:
在按钮的点击事件处理程序中,可以设置一个变量来记录上一次点击的时间,并与当前时间进行比较。如果两次点击间隔小于设定的时间阈值,则忽略这次点击。以下是一个简单的示例代码:
csharpDateTime lastClick=DateTime.Now;object obj=new object();int i=0;
private void Button_Click(object sender, RoutedEventArgs e){ lock (obj) { if ((DateTime.Now - lastClick).TotalMilliseconds <300) { return; // 忽略这次点击 }
lastClick=DateTime.Now; i++; // 执行按钮点击后的操作 }}
以上代码中,我们使用了`lock`语句来确保线程安全,并设置了300毫秒作为两次点击的最小间隔时间。如果两次点击间隔小于300毫秒,则`return`语句会阻止事件进一步执行,从而避免多次触发click事件。
解决WPF中button按钮同时点击多次触发click的方法,供大家参考,具体内容如下
DateTime lastClick = DateTime.Now; object obj = new object(); int i = 0; private void Button_Click(object sender, RoutedEventArgs e) { this.IsEnabled = false; var t = (DateTime.Now - lastClick).TotalMilliseconds; i++; lastClick = DateTime.Now; System.Diagnostics.Debug.Print(t + "," + i + ";" + DateTime.Now); Thread.Sleep(2000); this.IsEnabled = true; }
以上代码并没法解决用户点击两次按钮触发两次的问题,因为ui线程是单线程的,所以这个这样会导致用户连续点击两次,会两秒后又调用Button_Click一次,输出如下:
1207.069,1;2017年4月19日 13:58:22
2055.1176,2;2017年4月19日 13:58:24
所以要在this.IsEnabled = false;后面强制界面刷新,代码如下:
private void Button_Click(object sender, RoutedEventArgs e) { this.IsEnabled = false; DispatcherHelper.DoEvents(); var t = (DateTime.Now - lastClick).TotalMilliseconds; i++; lastClick = DateTime.Now; System.Diagnostics.Debug.Print(t + "," + i + ";" + DateTime.Now); Thread.Sleep(2000); this.IsEnabled = true; } public static class DispatcherHelper { [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] public static void DoEvents() { DispatcherFrame frame = new DispatcherFrame(); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrames), frame); try { Dispatcher.PushFrame(frame); } catch (InvalidOperationException) { } } private static object ExitFrames(object frame) { ((DispatcherFrame)frame).Continue = false; return null; } }
DispatcherHelper.DoEvents();这个方法会强制界面刷新,问题就解决了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计521个文字,预计阅读时间需要3分钟。
解决WPF中Button按钮同时多次点击触发click事件的方法如下:
在按钮的点击事件处理程序中,可以设置一个变量来记录上一次点击的时间,并与当前时间进行比较。如果两次点击间隔小于设定的时间阈值,则忽略这次点击。以下是一个简单的示例代码:
csharpDateTime lastClick=DateTime.Now;object obj=new object();int i=0;
private void Button_Click(object sender, RoutedEventArgs e){ lock (obj) { if ((DateTime.Now - lastClick).TotalMilliseconds <300) { return; // 忽略这次点击 }
lastClick=DateTime.Now; i++; // 执行按钮点击后的操作 }}
以上代码中,我们使用了`lock`语句来确保线程安全,并设置了300毫秒作为两次点击的最小间隔时间。如果两次点击间隔小于300毫秒,则`return`语句会阻止事件进一步执行,从而避免多次触发click事件。
解决WPF中button按钮同时点击多次触发click的方法,供大家参考,具体内容如下
DateTime lastClick = DateTime.Now; object obj = new object(); int i = 0; private void Button_Click(object sender, RoutedEventArgs e) { this.IsEnabled = false; var t = (DateTime.Now - lastClick).TotalMilliseconds; i++; lastClick = DateTime.Now; System.Diagnostics.Debug.Print(t + "," + i + ";" + DateTime.Now); Thread.Sleep(2000); this.IsEnabled = true; }
以上代码并没法解决用户点击两次按钮触发两次的问题,因为ui线程是单线程的,所以这个这样会导致用户连续点击两次,会两秒后又调用Button_Click一次,输出如下:
1207.069,1;2017年4月19日 13:58:22
2055.1176,2;2017年4月19日 13:58:24
所以要在this.IsEnabled = false;后面强制界面刷新,代码如下:
private void Button_Click(object sender, RoutedEventArgs e) { this.IsEnabled = false; DispatcherHelper.DoEvents(); var t = (DateTime.Now - lastClick).TotalMilliseconds; i++; lastClick = DateTime.Now; System.Diagnostics.Debug.Print(t + "," + i + ";" + DateTime.Now); Thread.Sleep(2000); this.IsEnabled = true; } public static class DispatcherHelper { [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] public static void DoEvents() { DispatcherFrame frame = new DispatcherFrame(); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrames), frame); try { Dispatcher.PushFrame(frame); } catch (InvalidOperationException) { } } private static object ExitFrames(object frame) { ((DispatcherFrame)frame).Continue = false; return null; } }
DispatcherHelper.DoEvents();这个方法会强制界面刷新,问题就解决了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

