WPF - 下一个屏幕上的排队鼠标事件触发器

时间:2015-04-16 16:27:59

标签: c# wpf event-handling queue mouseevent

简介 我有一个WPF应用程序。 当我单击/双击按钮以显示下一个屏幕时,将使用MouseLeftButtonDown和MouseLeftButtonUp捕获。 - MouseLeftButtonDown使按钮变暗 - MouseLeftButtonUp将我发送到下一个屏幕

问题: 如果我“垃圾”或有时只是点击按钮上的2-3次(我们说这种情况下是3次),它就会开始加载下一个屏幕。当显示下一个屏幕时,队列中会留下两次鼠标点击,如果鼠标位于第二个屏幕上的另一个新按钮上,则会点击该按钮。

我试过像:

这样的东西
    void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.Wait;
        if (this.IsVisible && this.IsLoaded)
            OnButtonPatient();
    }

但两个属性都设置为true。 我想那是正确的,因为我可以在鼠标事件触发时看到按钮。 这些事件可以解释为:

  1. 3次鼠标点击
  2. 鼠标光标=等待光标
  3. 下一个屏幕已加载
  4. 鼠标光标=正常
  5. 鼠标光标=等待光标
  6. 点击下一个按钮
  7. 我该如何处理? 我不希望在之前的屏幕上发生鼠标事件,然后继续我的下一个屏幕。 问候!

2 个答案:

答案 0 :(得分:1)

我尝试使用StackPanel作为控件的一个简单示例。虽然我不确定为什么你没有使用按钮点击事件,如果你使用按钮(为什么要按下ButtonUp?)

private int count = 0;
        private void StackPanel_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (count == 0 && (sender as StackPanel).IsMouseOver)
            {
                Mouse.OverrideCursor = Cursors.Wait;
                count++;
            }

            e.Handled = true;
        }

        private void StackPanel_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (count == 1 && (sender as StackPanel).IsMouseOver)
            {
                Mouse.OverrideCursor = Cursors.Arrow;
                count++;
            }

            e.Handled = true;
        }

答案 1 :(得分:0)

我建议在MouseUp事件触发时检查第一个窗口/屏幕上的IsMouseOver属性。这样可以过滤掉新窗口阻塞第一个窗口的事件。

void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    Mouse.OverrideCursor = Cursors.Wait;
    if (this.IsVisible && this.IsLoaded && this.IsMouseOver)
        OnButtonPatient();
}