2011-06-22 34 views
8

Làm cách nào để lặp lại hành động khi nút chuột trái được nhấn và giữ trong WPF?WPF: Nhấp chuột trái vào nút và giữ xuống xử lý

Việc xử lý sự kiện sau đây cho sự kiện UIElement.PreviewMouseLeftButtonDown không hoàn thành công việc:

private void BaseButtonRight_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      // keep performing action while mouse left button is pressed. 
      // Checking e.ButtonState works only for one click 

     } 

Thực hiện thậm chí không nhận được vào vòng lặp while và xử lý được gọi khi nút chuột trái được phát hành!

Trả lời

17

Tại sao không sử dụng một RepeatButton?

http://msdn.microsoft.com/en-us/library/ms746649(v=vs.85).aspx

+1

Đây phải là câu trả lời được chấp nhận. – GONeale

+0

@GONeale, trừ khi OP không sử dụng nút ... Tôi đang gặp vấn đề tương tự và tôi không nhấp vào nút để câu trả lời này không giúp tôi. Tôi sẽ sử dụng câu trả lời chủ đề nền. Nhưng có, OP nên chọn câu trả lời hoặc đăng câu trả lời của riêng mình và chọn câu trả lời đó. – CramerTV

+0

Boy, quên bối cảnh theo đó câu hỏi đã được hỏi nhưng sẽ chấp nhận câu trả lời này. –

0

Chạy chuỗi cho đến khi MouseLeftButtonUp được kích hoạt.

+0

Tôi cần thao tác với giao diện người dùng. Xem bình luận dưới đây. –

1

Khởi động BackroundWorker thoát khi chuột được phát hành. Đặt cờ với sự kiện di chuột lên và cũng kiểm tra định kỳ trong chức năng DoWork của BackgroundWorker. Đảm bảo bạn sử dụng khóa {} để truy cập cờ.

Edit: trong trường hợp bạn muốn truy cập vào một cái gì đó trên thread UI, sử dụng Dispatcher.BeginInvoke, ví dụ:

Dispatcher.BeginInvoke(new ThreadStart(delegate 
{ 
    ComboBoxItem selItem = ComboboxConnectString.SelectedItem as ComboBoxItem; 
    if (selItem != null && selItem.Tag is string) 
     ComboboxConnectString.Text = (string)selItem.Tag; 
})); 
+0

Công việc cần được thực hiện bao gồm thao tác với RenderTransform của phần tử giao diện người dùng. Bằng cách sử dụng một BackgroundWorker là tìm kiếm đầy thử thách .. BackgroundWorker.DoWork về cơ bản sẽ ngủ nhưng nếu tôi marshaling để thread UI, làm thế nào để tôi gọi BackgroundWorker.DoWork một lần nữa? –

+0

Khi bạn muốn gọi lại chuỗi giao diện người dùng để sửa đổi RenderTransform, hãy làm như vậy với Dispatcher.BeginInvoke (Tôi đã chỉnh sửa bài đăng của mình để bao gồm mẫu). Việc sửa đổi sau đó sẽ thực hiện trong chuỗi giao diện người dùng trong khi bạn tiếp tục lặp lại. Đây là phương thức tương tự mà mọi người sử dụng để thực hiện tác vụ nền trong khi cập nhật thanh tiến trình. –

Các vấn đề liên quan