2012-12-02 4 views
7

Tôi đang làm việc trên một ứng dụng WPF nơi tôi xử lý một sự kiện chuột mà cuối cùng cho thấy MessageBox .. Nhưng sau khi MessageBox xuất hiện trên mouseDown, nó ăn lên tương ứng MouseUp sự kiện của một điều khiển.Hiển thị MessageBox trên MouseDown ăn lên sự kiện MouseUp

Kịch bản có thể dễ dàng sao chép bằng cách đơn giản xử lý MouseDown và sự kiện MouseUp trong WPF cửa sổ như: -

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 nhắn không bao giờ được chứng minh, một khi bảng thông báo xuất hiện trên sự kiện MouseDown.

+2

Vâng, hộp tin nhắn đang chặn; điều gì sẽ xảy ra nếu bạn gỡ bỏ trình xử lý chuột xuống? Vấn đề ban đầu bạn đang cố giải quyết là gì? –

Trả lời

0

Khi người nhận xét trên bài đăng gốc của bạn cho biết, có vẻ như những gì đang xảy ra ở đây là chuột của người dùng nằm ngoài tiêu điểm để nhấp vào hộp tin nhắn hoặc thậm chí chỉ để hiển thị nó. - sự kiện này không bao giờ được gọi. Nếu bạn chỉ muốn hiển thị hộp thư, thì chỉ cần sử dụng:

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

nên thực hiện công việc. Nếu hành vi này lặp lại cho một cái gì đó như thay đổi một tiêu đề cửa sổ, hoặc bất cứ điều gì mà không yêu cầu người dùng nhập vào, thì đây có thể là một vấn đề, nhưng tôi chắc chắn 100% rằng đây chỉ là một vấn đề liên quan đến MessageBox. Hy vọng điều này đã giúp.

2

Điều gì về việc khởi tạo phiên bản mới System.Threading.Thread để gọi số MessageBox sao cho chuỗi giao diện người dùng chính sẽ không bị gián đoạn bởi lời nhắc?

Ví dụ

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 
} 

Ảnh chụp màn hình

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

Cảm ơn,
Tôi hy vọng bạn tìm thấy điều này hữu ích :)

+1

Tôi không thể hiển thị thông báo trên một chuỗi khác vì nó tạo hộp thông báo không theo phương thức. Nếu tôi cố gắng để gửi các tin nhắn hộp trên dispatcher và hiển thị tin nhắn sau đó vấn đề vẫn còn tồn tại và vấn đề không chỉ với sự kiện lên chuột của nó với bất kỳ cửa sổ tin nhắn trong hàng đợi những tin nhắn được ăn lên bởi hộp tin nhắn. – Karan

+0

@Karan [Cửa sổ phương thức là cửa sổ con yêu cầu người dùng tương tác với nó trước khi họ có thể quay lại hoạt động ứng dụng gốc] (http://en.wikipedia.org/wiki/Modal_window). Làm thế nào để bạn muốn 'MessageBox' được phương thức mà không can thiệp vào các sự kiện? Tôi hiện không có ý tưởng để làm một điều như vậy. Xin lỗi vì điều đó :( –

0

@picrofo giải pháp là cũng tốt và dễ dàng nhưng tôi đã làm theo cách này

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

     } 

    }