WPF:按钮单击+;双击问题

WPF:按钮单击+;双击问题,wpf,timer,mouseclick-event,Wpf,Timer,Mouseclick Event,我必须以不同的反应处理WPF应用程序中按钮的单击和双击。 不幸的是,在双击时,WPF会触发两次单击事件和一次双击事件,因此很难处理这种情况 它试图用定时器解决它,但没有成功…我希望你能帮助我 让我们看看代码: private void delayedBtnClick(object statInfo) { if (doubleClickTimer != null) doubleClickTimer.Dispose(); doubleClickTimer = null

我必须以不同的反应处理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

我已经尝试使用更长的时间,一个布尔标志和锁

你有什么想法吗


最好的

如果在处理
MouseDoubleClick
事件后,将
RoutedEvent
e.Handled
设置为
true
,则在
MouseDoubleClick
之后,它将不会第二次调用
Click
事件

有一个例子涉及到对
SingleClick
DoubleClick
有不同的行为,这可能很有用

但是,如果您确定需要单独的行为,并且希望/需要阻止第一次
单击
以及第二次
单击
,则可以像以前一样使用
Dispatcher

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");
}
你可以试试这个:

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
    }
}

如有必要,您可以要求单击鼠标,然后等待鼠标移动以执行操作。

非常感谢!e.Handled=true就是诀窍!再次感谢您的快速反应:)如果您将该构造函数用于Dispatchermer,计时器将立即启动,这将导致一个虚假的单击事件。背景和当前值也是默认值,所以会有点混淆(虽然可能有巫毒在那里!)。但是非常有用-干杯!我在代码中没有看到双击时间的用法。相反,我看到了一个硬编码的延迟。这是否正常?如果任何人正在寻找允许在元素上设置单击和双击命令的自定义行为,请参见(采用类似的基于计时器的方法等待查看系统信息中是否有第二次单击。双击时间),谢谢您的回答!我没有试过,因为第一条建议解决了我的问题——但再次感谢你!:)我试过这个,效果很好。希望此评论对其他人有所帮助。谢谢Josh。这不会妨碍第一次单击事件,因为对于第一次单击事件e.ClickCount=1。这到底应该如何工作?该事件在第一次鼠标按下后触发。无论您以后做什么,例如ClickCount将始终为1。不建议使用C#上的WPF在鼠标悬停前计算单击,因为这样会阻止用户取消单击。