2012-12-02 41 views
7

我正在處理一個WPF應用程序,我處理的鼠標向下事件最終顯示爲 MessageBox ..但是在MessageBox出現在mouseDown上後,它吃掉了控件的相應MouseUp事件。在MouseDown上顯示MessageBox會吃掉MouseUp事件

方案可以通過簡單地操作的MouseDown和MouseUp事件在WPF窗口 能夠很容易地再現: - 從未顯示

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事件。

+2

那麼,消息框是阻止;如果您刪除鼠標放下處理程序會發生什麼?什麼是你想要解決的原始問題? –

回答

0

正如你原帖的評論者所說,看起來這裏發生的事情是,用戶的鼠標不在焦點上單擊消息框,甚至只是爲了顯示它,所以鼠標總是向上移動 - 事件從未被調用。 如果你只是想顯示消息框,然後簡單地使用:

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的一個問題。希望這有助於。

2

如何初始化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 
} 

截圖

Calling a MessageBox in a different thread to avoid interrupting the main user interface thread

謝謝,
我希望對您有所幫助:)

+1

我無法在另一個線程上顯示消息,因爲它會創建非模態消息框。如果我嘗試在調度器上發佈消息框並顯示消息,那麼問題仍然存在,並且問題不僅在於鼠標事件發生時它與隊列中的任何Windows消息一起消息被消息框消除。 – Karan

+0

@Karan [模態窗口是一個子窗口,要求用戶在返回到父應用程序之前與其進行交互](http://en.wikipedia.org/wiki/Modal_window)。你如何希望'MessageBox'是模態而不會干擾事件?我目前沒有想法做這樣的事情。對於那個很抱歉 :( –

0

@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); 

     } 

    } 
相關問題