2010-08-04 19 views

Trả lời

18

Hãy tưởng tượng một cửa sổ có chứa một hệ thống phân cấp dày đặc các điều khiển con. Bây giờ chúng ta hãy nói rằng bạn muốn làm một cái gì đó, có một nhấp chuột phải bất cứ nơi nào trong cửa sổ của bạn.

  • Với sự kiện bình thường, bạn phải xử lý sự kiện Nhấp cho tất cả các điều khiển vì bạn không chắc chắn người dùng có thể nhấp vào.
  • Với WP2's routed events, các sự kiện hoặc "bong bóng" hoặc "đường hầm" (nghĩa là di chuyển lên cây giao diện người dùng hoặc xuống) nếu họ không tìm thấy trình xử lý sự kiện, "xử lý" nó ở cấp hiện tại. Vì vậy, bạn có thể viết một trình xử lý cho sự kiện của cửa sổ, ví dụ: TopLevel. (WPF có quy ước về cặp sự kiện, PreviewXXX và XXX - sự kiện PreviewXXX kích hoạt đầu tiên và đường hầm xuống từ gốc để điều khiển nhận được kích thích và sự kiện XXX đối tác sau đó bật lên từ điều khiển con trở về gốc). Vì vậy, nếu bạn nhấp chuột phải vào một nút, WPF sẽ chuyển lên hệ thống phân cấp UI, gọi tất cả các trình xử lý mà nó tìm thấy (trừ khi ai đó đánh dấu sự kiện đã "xử lý" trong sự kiện args.)
+0

Xem trước sự kiện là đường hầm, không sủi bọt. –

+1

@John - Rất tiếc! wpf của tôi đã trở thành một chút gỉ. Cảm ơn bạn đã sửa ... cập nhật. – Gishu

1

Sự kiện định tuyến là sự kiện có nhiều hơn ' khả năng di chuyển ', như được đề cập trong câu trả lời Gishu's. sự kiện Routed được đại diện bởi một thể hiện của một lớp RoutedEvent + Sự kiện NET bình thường, mà kết thúc tốt đẹp nó:

public class MyClassWithARoutedEvent : UIElement 
    { 
     public static readonly RoutedEvent DoSomethingEvent; 

     public event RoutedEventHandler DoSomething 
     { 
      add { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
      remove { base.AddHandler (MyClassWithARoutedEvent.DoSomethingEvent, value); 
     } 
    } 

Bạn thường sẽ sử dụng sự kiện mời chào trong tình huống như vậy:

  • Thực hiện kiểm soát của riêng bạn mà liên tục tích hợp với cơ sở hạ tầng của WPF
  • Sự kiện chế biến, được kích hoạt bởi các điều khiển khác nhau tại một gốc chung
  • Phân loại thông tin liên lạc giữa các phần tử trong cây phần tử Trong hầu hết các trường hợp, bạn có thể Tôi có thể sử dụng cơ sở hạ tầng sự kiện định tuyến mà không hề chú ý đến nó.

Ngoài ra, điều đáng nói là bạn có thể sử dụng RoutedEvent trong tầm kiểm soát của mình ngay cả khi nó không xác định hoặc thậm chí thừa kế từ phần tử. Đó là bởi vì bạn thực sự có thể nghĩ về một cá thể RoutedEvent như một tên được đánh máy mạnh mẽ của một sự kiện. Vì vậy, nếu bạn có quyền truy cập vào 'tên' này (đây là lý do tại sao một trường hợp của một sự kiện được định tuyến thường được công khai), bạn có thể nợ nó:

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