Tôi có một bảng điều khiển trong Biểu mẫu của tôi với trình xử lý sự kiện nhấp chuột. Tôi cũng có một số điều khiển khác bên trong bảng điều khiển (nhãn, bảng khác, vv). Tôi muốn sự kiện nhấp chuột đăng ký nếu bạn nhấp vào bất kỳ đâu trong bảng điều khiển. Sự kiện nhấp chuột hoạt động miễn là tôi không nhấp vào bất kỳ điều khiển nào trong bảng điều khiển nhưng tôi muốn kích hoạt sự kiện bất kể bạn nhấp vào bên trong bảng điều khiển ở đâu. Điều này có thể xảy ra nếu không thêm cùng một sự kiện nhấp chuột vào tất cả các điều khiển bên trong bảng điều khiển không?Xử lý sự kiện nhấp ở bất kỳ đâu trong bảng điều khiển trong C#
Trả lời
Bạn đã sử dụng để có thể ghi đè phương pháp OnBubbleEvent trên điều khiển. Trong WPF cơ chế được gọi là sự kiện Routed: http://weblogs.asp.net/vblasberg/archive/2010/03/30/wpf-routed-events-bubbling-several-layers-up.aspx
tôi cần các chức năng chính xác cùng một ngày hôm nay, vì vậy đây là thử nghiệm và hoạt động:
1: Tạo một subclasser mà có thể cướp mouseclick của bạn:
internal class MessageSnatcher : NativeWindow
{
public event EventHandler LeftMouseClickOccured = delegate{};
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_PARENTNOTIFY = 0x210;
private readonly Control _control;
public MessageSnatcher(Control control)
{
if (control.Handle != IntPtr.Zero)
AssignHandle(control.Handle);
else
control.HandleCreated += OnHandleCreated;
control.HandleDestroyed += OnHandleDestroyed;
_control = control;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PARENTNOTIFY)
{
if (m.WParam.ToInt64() == WM_LBUTTONDOWN)
LeftMouseClickOccured(this, EventArgs.Empty);
}
base.WndProc(ref m);
}
private void OnHandleCreated(object sender, EventArgs e)
{
AssignHandle(_control.Handle);
}
private void OnHandleDestroyed(object sender, EventArgs e)
{
ReleaseHandle();
}
}
2: khởi tạo các snatcher để móc vào WndProc bảng điều khiển:
private MessageSnatcher _snatcher;
public Form1()
{
InitializeComponent();
_snatcher = new MessageSnatcher(this.panel1);
}
3: The Message snatcher sẽ nhận được WM_PARENTNOTIFY nếu bạn click vào một chi ld kiểm soát.
Về mặt kỹ thuật, có thể là mặc dù là rất xấu xí. Bạn cần phải nắm bắt thông báo trước nó được gửi đến điều khiển đã được nhấp. Mà bạn có thể làm với IMessageFilter, bạn có thể đánh hơi một thông điệp đầu vào đã được loại bỏ khỏi hàng đợi tin nhắn trước khi nó được gửi đi. Như thế này:
using System;
using System.Drawing;
using System.Windows.Forms;
class MyPanel : Panel, IMessageFilter {
public MyPanel() {
Application.AddMessageFilter(this);
}
protected override void Dispose(bool disposing) {
if (disposing) Application.RemoveMessageFilter(this);
base.Dispose(disposing);
}
public bool PreFilterMessage(ref Message m) {
if (m.HWnd == this.Handle) {
if (m.Msg == 0x201) { // Trap WM_LBUTTONDOWN
Point pos = new Point(m.LParam.ToInt32());
// Do something with this, return true if the control shouldn't see it
//...
// return true
}
}
return false;
}
}
+1 Tôi cũng đã làm điều này và đồng ý nó sẽ làm việc độc đáo. Cảnh báo duy nhất của tôi là nó về cơ bản gắn vào máy bơm ứng dụng sự kiện tin nhắn, do đó hãy chắc chắn rằng bất cứ điều gì bạn làm trong "Làm điều gì đó với điều này ..." bit, làm cho nó nhanh chóng và hiệu quả. –
Meh, nó đã được lọc cho bảng điều khiển và thông báo. Mã này chạy theo thời gian của con người. –
Bit muộn cho bữa tiệc, Nhưng điều tôi làm là lập bản đồ tất cả sự kiện nhấp của tất cả các điều khiển bên trong sự kiện nhấp vào bảng điều khiển. Tôi biết cách tiếp cận khó chịu của nó. nhưng hey !!
- 1. Xử lý sự kiện chuột ở bất kỳ đâu với JavaFX
- 2. Chi tiết bảng trong SQL ở bất kỳ đâu?
- 3. Xử lý các sự kiện C# COM trong C++
- 4. Xử lý bảng điều khiển
- 5. Làm cách nào để xử lý sự kiện nhấp trong điều khiển Danh sách Spark trong Flex 4
- 6. Xử lý DataGridHyperlinkColumn Nhấp vào Sự kiện
- 7. Đóng hộp thoại khi nhấp chuột (ở bất kỳ đâu)
- 8. Làm cách nào để xử lý một nhấp chuột ở bất kỳ đâu trong trang, ngay cả khi một phần tử nhất định dừng quá trình truyền?
- 9. Thừa kế các trình xử lý sự kiện trong C#
- 10. Xử lý sự kiện nhấp siêu liên kết trong Outlook Mail trong C#
- 11. Cách xử lý^C trong các ứng dụng bảng điều khiển JVM?
- 12. Bất kỳ sự khác biệt về hình ảnh nào trong bảng điều khiển Linux?
- 13. cách kích hoạt sự kiện khi ai đó nhấp vào bất kỳ đâu trên màn hình trong ứng dụng android?
- 14. Cách xử lý sự kiện trong MVVM
- 15. WPF - Xử lý sự kiện từ điều khiển người dùng trong Chế độ xem
- 16. xử lý sự kiện jQuery onClick trên các thanh điều khiển
- 17. Xử lý sự kiện trong DataTemplate
- 18. Xử lý sự kiện trong Haskell
- 19. WPF - Xử lý sự kiện tùy chỉnh gắn trên tùy chỉnh điều khiển
- 20. Thêm trình xử lý sự kiện nhấp chuột vào Pushpin
- 21. Một loại đại biểu chung để xử lý bất kỳ sự kiện nào
- 22. Thêm một nút (hoặc bất kỳ điều khiển thực sự) vào một ListBox trong C# WPF?
- 23. Xử lý sự kiện CTRL + C trong Node.js trên Windows
- 24. Thêm trình xử lý sự kiện nhấp vào iframe
- 25. Xử lý các điều kiện Race trong C#
- 26. C#: gọi phương thức xử lý sự kiện nút mà không thực sự nhấp vào nút
- 27. Ctrl + C ngắt sự kiện xử lý trong Linux
- 28. Xử lý sự kiện cho groupBox với radioButtons trong C#
- 29. phương pháp liên kết trên sự kiện nhấp chuột của điều khiển "LabelLink" trong WPF - Caliburn
- 30. Nhiều sự kiện MouseHover trong Điều khiển
Đây có phải là WPF .....? –
Không, chỉ cần một cửa sổ thông thường hình thức ứng dụng –