【问题标题】:Showing MessageBox on MouseDown eats up MouseUp event在 MouseDown 上显示 MessageBox 会占用 MouseUp 事件
【发布时间】:2015-01-21 19:25:39
【问题描述】:

我正在开发一个 WPF 应用程序,在该应用程序中我处理了一个鼠标按下事件,该事件最终出现 MessageBox.. 但是MessageBox出现在mouseDown之后,它会吃掉一个控件对应的MouseUp事件。

只需在 WPF 窗口中处理 MouseDown 和 MouseUP 事件即可轻松重现场景 如:-

private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
   MessageBox.show("Hello, Mouse down");
}

private void Window_MouseUP(object sender, MouseButtonEventArgs e)
{
   MessageBox.show("Hello, Mouse Up");
}

MouseUp 消息永远不会显示,一旦消息框出现在 MouseDown 事件上。

【问题讨论】:

  • 嗯,消息框被阻塞了;如果删除鼠标按下处理程序会发生什么?您要解决的问题是什么?

标签: c# wpf mouseevent


【解决方案1】:

如何初始化System.Threading.Thread 的新实例以调用MessageBox,这样主用户界面线程就不会被提示中断?

示例

private void Window_MouseDown(object sender, MouseEventArgs e)
{
    Thread mythread = new Thread(() => MessageBox.Show("Hello, Mouse Down")); //Initialize a new Thread to show our MessageBox within 
    mythread.Start(); //Start the thread
}

private void Window_MouseUP(object sender, MouseEventArgs e)
{
    Thread mythread = new Thread(() => MessageBox.Show("Hello, Mouse Up")); //Initialize a new Thread to show our MessageBox within 
    mythread.Start(); //Start the thread
}

截图

谢谢,
希望对您有所帮助:)

【讨论】:

【解决方案2】:

正如您原始帖子的评论者所说,这里发生的情况似乎是用户的鼠标失去焦点以单击消息框,甚至只是为了显示它,所以鼠标无论如何都会“向上”移动 -该事件永远不会被调用。 如果您只是想显示消息框,那么只需使用:

private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
   MessageBox.show("Hello, Mouse down");
   MessageBox.show("Hello, your mouse must be up because you've shifted focus!");
}

应该做的工作。如果更改窗口标题或任何不需要用户输入的操作重复此行为,那么这可能是一个问题,但我 100% 确定这只是 MessageBox 的一个问题。希望这会有所帮助。

【讨论】:

    【解决方案3】:

    @picrofo 解决方案也很好,很简单,但我是这样做的

      DialogResult result;
     private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            string message = "would you like to see mouse up event?";
            string caption = "event trick";
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
    
            result = MessageBox.Show(message, caption, buttons);
            textBox1.Text = result.ToString();
            if (result == System.Windows.Forms.DialogResult.Yes)
            {
                button1_MouseUp(sender, e);
    
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多