2009-02-09 33 views
5

Tôi biết rằng khi bạn đăng ký một đối tượng cho các sự kiện đính kèm của chuột, bạn sẽ bị rò rỉ bộ nhớ. Đó là lý do tại sao bạn cần sử dụng WeakEvent pattern.Cách thức điều khiển WPF tích hợp quản lý trình xử lý sự kiện của họ cho một sự kiện được đính kèm?

Tôi gặp vấn đề với mẫu này: Nếu bạn muốn sử dụng nó, bạn không thể xác định trình xử lý của mình trong mã XAML.

Đối với tôi, nó có nghĩa là tất cả các mã như thế này rò rỉ:

<SomeControl Mouse.MouseDown="MyHandler" /> 

Trừ khi bạn loại bỏ xử lý của bạn một cách rõ ràng trong mã (Và tôi nghi ngờ rằng ai làm thế). Bây giờ có điều gì đó tôi không hiểu:

<Button Click="MyHandler" /> 

Mã này bằng cách nào đó sử dụng một nơi nào đó sự kiện Mouse.MouseDown để phát hiện nhấp chuột vào nút. Với một số nghiên cứu với phản xạ, tôi thấy rằng sự kiện này sử dụng MouseDown của lớp UIElement. Và khi tôi đọc mã của UIElement tôi không hiểu: không có WeakEventManager!

Ai đó có thể giải thích cho tôi cách UIElement nhận sự kiện từ Mouse.MouseDown mà không bị rò rỉ?

Trả lời

7

Sử dụng trình xử lý thông thường trong XAML không yêu cầu tham chiếu yếu.

Điều bạn đang làm là tạo tham chiếu bộ nhớ giữa điều khiển chính và điều khiển con chứa trong điều khiển này; điều khiển con trong trường hợp này là nút.

Nếu ai đó duy trì tham chiếu đến bất kỳ phần nào của cây thị giác cho điều khiển chính, toàn bộ cây sẽ ở trong bộ nhớ vì nó được liên kết với nhau (tham chiếu cha/con).

Bây giờ nếu tất cả các tham chiếu đến cây này bị xóa, tham chiếu sự kiện giữa cha mẹ và con (điều khiển chính và nút) không đáng kể vì các điều khiển này đã được liên kết thông qua các tham chiếu cha/con. Khi tất cả các tham chiếu bên ngoài bị xóa, điều khiển này có thể được thu thập rác.

Trình xử lý sự kiện trong XAML chỉ tạo tham chiếu sự kiện nội bộ.

Bạn phải cẩn thận khi khách hàng bên ngoài đăng ký sự kiện trên điều khiển, vì bạn đang tạo tham chiếu bên ngoài sẽ giữ cho kiểm soát còn sống miễn là liên kết và ứng dụng tồn tại (trừ khi tham chiếu yếu) .

Câu hỏi của bạn là về các sự kiện được đính kèm. Dường như không có bất kỳ tài liệu rõ ràng nào về việc các sự kiện đính kèm có gây ra rò rỉ bộ nhớ hay không. Có vẻ như tôi kiểm soát giao diện người dùng đăng ký sự kiện chứa tham chiếu đến sự kiện thay vì theo cách khác, nhưng tôi cho rằng đối tượng sự kiện tĩnh phải có một số cách để thông báo cho điều khiển rằng nó đã được kích hoạt. Có vẻ như một sự thiếu bình luận đáng ngạc nhiên về điều này từ Microsoft.

+0

Tôi đồng ý với bạn, tuy nhiên trình xử lý trong XAML cho sự kiện đính kèm (Tôi không nói về các sự kiện kiểm soát 'nhưng sự kiện là Mouse.MouseDown) có thể bị rò rỉ, vì luôn có tham chiếu về nó. Nội bộ, Lớp nút sử dụng các sự kiện Mouse.MouseDown (UIElement là cụ thể) .Và tôi không biết tại sao điều này không bị rò rỉ. –

+0

Điểm tốt. Các sự kiện được đính kèm là các tham chiếu bên ngoài. –

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