2010-06-13 26 views
8

Tôi đang cố gắng kích hoạt sự kiện MouseLeftButtonDown theo cách thủ công trên điều khiển WPF theo chương trình, vì tôi đang sử dụng Microsoft Surface SDK, không kích hoạt các sự kiện MouseLeftButtonDown, nhưng sự kiện ContactDown. Về cơ bản tôi đang cố gắng đẩy sự kiện MouseLeftButtonDown xuống điều khiển, để kích hoạt hành vi đúng trên điều khiển, trong khi xử lý một sự kiện ContactDown.Kích hoạt MouseLeftButtonDown event programmatically

Tôi đoán tôi phải bằng cách nào đó sử dụng phương pháp RaiseEvent trên điều khiển để làm điều này với MouseButtonEventArgs, nhưng tôi đang gặp một số vấn đề trong việc tìm ra các tham số.

Cảm ơn trước sự giúp đỡ của bạn!

Trả lời

5

Bạn có thể giả mạo chuột và các sự kiện quan trọng bằng cách sử dụng Inter32 interop. Điều tra hàm SendInput trên MSDN/pinvoke.net.

Lưu ý rằng điều này sẽ làm cho hệ thống và các ứng dụng khác nghĩ rằng chuột đã thực sự được nhấp. Nếu bạn chỉ muốn bắt đầu một sự kiện WPF, hãy thử RaiseEvent(new RoutedEventArgs(UIElement.MouseLeftButtonDownEvent)).

+0

Cảm ơn mẹo. Tôi nhận được một ngoại lệ với phương thức RaiseEvent mà bạn đã đăng: Đối tượng thuộc loại 'System.Windows.RoutedEventArgs' không thể được chuyển thành loại 'System.Windows.Input.MouseButtonEventArgs'. – RajenK

+0

Hãy thử 'RaiseEvent (new MouseButtonEventArgs (Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left)); ' – devios1

+1

InvalidOperationException xảy ra với cái đó: Mọi RoutedEventArgs phải có một RoutedEvent không null liên kết với nó. – RajenK

2

Mong muốn kích hoạt một sự kiện nhất định trong điều khiển thường là dấu hiệu của một vấn đề thiết kế trong mã. Trình xử lý sự kiện nên hoạt động kích hoạt, không thực hiện nó. Tôi sẽ đề nghị bạn di chuyển mã thực hiện hành động được kích hoạt bởi trình xử lý sự kiện MouseLeftButtonDown thành một phương thức riêng biệt. Sau đó, phương thức tương tự có thể được gọi từ trình xử lý sự kiện ContactDown.

+0

Tôi đồng ý rằng đó sẽ là giải pháp tốt nhất, nhưng vì tôi không có quyền truy cập vào mã nguồn của điều khiển cụ thể này (chỉ nhị phân), tôi e rằng sẽ không hoạt động. – RajenK

2
var grid = new Grid();    

int timestamp = new TimeSpan(DateTime.Now.Ticks).Milliseconds; 
const MouseButton mouseButton = MouseButton.Left; 
var mouseDownEvent = 
    new MouseButtonEventArgs(Mouse.PrimaryDevice, timestamp, mouseButton) { 
     RoutedEvent = UIElement.MouseLeftButtonDownEvent, 
     Source = grid, 
    }; 

Đây là cách tôi kích hoạt sự kiện trong mã thử nghiệm của mình.

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