10

Tôi đang cố thêm một PropertyChangedCallback vào UIElement.RenderTransformOriginProperty. Một ngoại lệ được ném khi tôi cố gắng ghi đè lên PropertyMetadata.Làm cách nào để thêm logic vào cuộc gọi lại thuộc tính phụ thuộc hiện tại?

Tôi đã tìm kiếm MSDN và Google và tất cả những gì tôi có thể tìm ra là this. DependencyPropertyDescriptor.AddValueChanged được đề xuất tại một số điểm trong bài viết đó, nhưng điều đó sẽ không giải quyết được vấn đề của tôi vì đây không phải là một cuộc gọi lại từng cá thể.

Tôi không hiểu ý nghĩa của ngoại lệ này. Có ai biết tôi đang làm gì sai không?

public class foo : FrameworkElement 
{ 
    private static void Origin_Changed(DependencyObject d, 
             DependencyPropertyChangedEventArgs e) 
    { } 

    static foo() 
    { 
     PropertyMetadata OriginalMetaData = 
      UIElement.RenderTransformOriginProperty.GetMetadata(
       typeof(FrameworkElement)); 



/*An exception is thrown when this line is executed: 
"Cannot change property metadata after it has been associated with a property"*/ 
     OriginalMetaData.PropertyChangedCallback += 
      new PropertyChangedCallback(Origin_Changed); 



     UIElement.RenderTransformOriginProperty.OverrideMetadata(
      typeof(foo), OriginalMetaData); 
    } 
} 

Trả lời

20

WPF sẽ hợp nhất siêu dữ liệu thuộc tính cho bạn khi bạn gọi OverrideMetadata, không cần chuyển đối tượng siêu dữ liệu gốc đó. Vì vậy, tất cả những gì bạn phải làm là

UIElement.RenderTransformOriginProperty.OverrideMetadata(typeof(foo), new PropertyMetadata(new PropertyChangedCallback(Origin_Changed))); 

Một điều cần lưu ý là đôi khi mã ở trên ném một ngoại lệ. Hai trường hợp xảy ra là

1. Siêu dữ liệu gốc là phân lớp của PropertyMetadata - Tôi đã thấy FrameworkPropertyMetadata và UIPropertyMetadata. Bạn chỉ cần sử dụng cái thích hợp trong mỗi trường hợp.

2. Thuộc tính phụ thuộc chỉ đọc và bạn không thể làm gì về nó.

+0

Thật hoàn hảo! Cảm ơn! Tôi có xu hướng giả định rằng framework sẽ không tự động làm việc đó cho tôi. Tôi đoán nó chỉ là mối nguy hiểm của một con người cấp thấp trong thời đại thống trị cấp cao ... – Giffyguy

+0

Hehe, tôi có thể thông cảm với điều đó. Tôi đã dành vô số giờ cố gắng để uốn cong WPF từ một quan điểm lập trình Win32 khi tôi không thể làm việc ra "cosher" WPF cách. –

+0

Về chỉnh sửa của bạn: Oh dang, điều đó ném tôi đi một chút - tôi cần lắng nghe những thay đổi đối với một số thuộc tính phụ thuộc FrameworkElement chỉ đọc, cũng như ... Đây là trường hợp, bạn sẽ đề xuất điều gì? Tôi thực sự, thực sự không muốn cố gắng để thực hiện nó bằng cách sử dụng AddValueChanged trên mọi trường hợp của lớp học của tôi. Mặc dù, tôi đoán tôi sẽ không nhớ, miễn là nó không có bất kỳ hit hiệu suất nào - so với PropertyChangedCallback. Than ôi, điều này cần phải có hiệu quả, bằng mọi cách. – Giffyguy

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