我必须处理单击和双击WPF应用程序中的按钮并进行不同的反应。 不幸的是,在双击时,WPF会触发两次点击事件和双击事件,因此很难处理这种情况。
它试图用计时器解决它但没有成功......我希望你能帮助我。
让我们看看代码:
private void delayedBtnClick(object statInfo)
{
if (doubleClickTimer != null)
doubleClickTimer.Dispose();
doubleClickTimer = null;
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate()
{
// ... DO THE SINGLE CLICK ACTION
}));
}
private void btn_Click(object sender, RoutedEventArgs e)
{
if (doubleClickTimer == null)
doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite);
}
}
}
private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (doubleClickTimer != null)
doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite); // disable it - I've tried it with and without this line
doubleClickTimer.Dispose();
doubleClickTimer = null;
//.... DO THE DOUBLE CLICK ACTION
}
问题是双击时“双击”动作后调用“单击动作”。奇怪的是,我在双击时将doubleClickTimer
设置为null,但在delayedBtnClick
中它是真的:O
我已经尝试使用更长的时间,一个布尔旗并锁定......
你有什么想法吗?
最佳!
答案 0 :(得分:16)
如果您在处理RoutedEvent
事件后将e.Handled
的{{1}}设置为true
,那么它将不会在第二次调用MouseDoubleClick
事件后Click
。
有recent post涉及MouseDoubleClick
和SingleClick
的不同行为,可能会有用。
但是,如果您确定需要单独的行为并希望/需要阻止第一个DoubleClick
以及第二个Click
,则可以像使用Click
一样使用DispatcherTimer
。
private static DispatcherTimer myClickWaitTimer =
new DispatcherTimer(
new TimeSpan(0, 0, 0, 1),
DispatcherPriority.Background,
mouseWaitTimer_Tick,
Dispatcher.CurrentDispatcher);
private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
// Stop the timer from ticking.
myClickWaitTimer.Stop();
Trace.WriteLine("Double Click");
e.Handled = true;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
myClickWaitTimer.Start();
}
private static void mouseWaitTimer_Tick(object sender, EventArgs e)
{
myClickWaitTimer.Stop();
// Handle Single Click Actions
Trace.WriteLine("Single Click");
}
答案 1 :(得分:6)
你可以试试这个:
Button.MouseLeftButtonDown += Button_MouseLeftButtonDown;
private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
if (e.ClickCount > 1)
{
// Do double-click code
}
else
{
// Do single-click code
}
}
如有必要,您需要点击鼠标并等到鼠标向上执行操作。