2012-12-02 8 views
7

Sto lavorando a un'applicazione WPF in cui ho gestito un evento del mouse che mostra fino a MessageBox .. Ma dopo MessageBox appare su mouseDown, mangia l'evento MouseUp corrispondente di un controllo.Mostrando MessageBox su MouseDown mangia l'evento MouseUp

scenario può essere facilmente riprodotto semplicemente la gestione MouseDown e MouseUp nella finestra di WPF come: -

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 messaggio non viene mai mostrato, una volta che compare sul messagebox evento MouseDown.

+2

Bene, la finestra di messaggio sta bloccando; cosa succede se si rimuove il gestore del mouse verso il basso? Qual è il problema originale che stai cercando di risolvere? –

risposta

0

Come ha detto il commentatore sul post originale, sembra che ciò che sta accadendo qui sia che il mouse dell'utente vaga fuori fuoco per fare clic nella finestra del messaggio, o anche solo per visualizzarlo, quindi il mouse si sposta "su" in ogni caso - l'evento non viene mai chiamato. Se sei solo vuole mostrare i messageboxes, poi semplicemente utilizzando:

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!"); 
} 

dovrebbe fare il lavoro. Se questo comportamento si ripete per qualcosa come cambiare il titolo di una finestra, o qualsiasi cosa che non richiede l'input dell'utente, allora questo potrebbe essere un problema, ma sono sicuro al 100% che questo è solo un problema per quanto riguarda il MessageBox. Spero che questo abbia aiutato.

2

Che dire di inizializzare una nuova istanza di System.Threading.Thread per chiamare il MessageBox in modo che il thread dell'interfaccia utente principale non venga interrotto dal prompt?

Esempio

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 
} 

Schermata

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

Grazie,
spero che è risultato utile :)

+1

Non riesco a mostrare il messaggio su un altro thread mentre crea una finestra di messaggio non modale. Se provo a postare la finestra del messaggio sul dispatcher e mostrare il messaggio, il problema persiste e il problema non è solo con l'evento mouse up, ma con qualsiasi messaggio di Windows nella coda quei messaggi vengono mangiati dalla finestra del messaggio. – Karan

+0

@Karan [Una finestra modale è una finestra secondaria che richiede agli utenti di interagire con essa prima che possano tornare a utilizzare l'applicazione padre] (http://en.wikipedia.org/wiki/Modal_window). Come vuoi che il 'MessageBox' sia modale senza interferire con gli eventi? Al momento non ho idee per fare una cosa del genere. Mi dispiace per quello :( –

0

@picrofo soluzione è anche buono e facile ma ho fatto in questo modo

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

     } 

    }