10

UIElement.RenderTransformOriginProperty'ye PropertyChangedCallback eklemeye çalışıyorum. PropertyMetadata'yı geçersiz kılmaya çalıştığımda bir istisna atılır.Varolan bir bağımlılık özelliği geri çağrısına nasıl mantık ekleyebilirim?

MSDN ve Google'da arama yaptım ve tüm yapabilme yeteneğim this. DependencyPropertyDescriptor.AddValueChanged, bu gönderide bir noktada önerilir, ancak bu, her bir örnek geri çağrı olmadığından sorunumu çözmez.

Bu özel durumun ne anlama geldiğini anlamıyorum. Yanlış yaptığımı bilen var mı?

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); 
    } 
} 

cevap

20

Eğer OverrideMetadata çağırdığınızda WPF sizin için özellik meta birleşecek, gerek orijinal Meta veri nesnesi geçmek. Yani tüm yapmanız gereken

Dikkat edilmesi gereken bir şey, bazen yukarıdaki kodun bir istisna oluşturmasıdır. Bu olduğu iki durum orijinal meta PropertyMetadata bir alt sınıfıdır

1. - ı FrameworkPropertyMetadata ve UIPropertyMetadata gördük. Her durumda uygun olanı kullanmanız yeterlidir.

2. Bağımlılık özelliği yalnızca okunur ve bu konuda bir şey yapamazsınız.

+0

Bu mükemmel! Teşekkürler! Çerçevenin otomatik olarak benim için böyle bir iş yapmayacağını düşünmeye eğilimliyim. Sanırım yüksek seviye egemenlik döneminde düşük seviyeli bir mühendis olmanın öfke tehlikesi ... – Giffyguy

+0

Hehe, buna sempati duyabiliyorum. WPF'yi "cosher" WPF yolunu kullanamadığım zaman bir Win32 programcı bakış açısıyla bükmeye çalışmak için sayısız saatler harcadım. –

+0

Düzenlemenizle ilgili olarak: Oh dang, bu beni biraz atıyor - Bazı salt okunur FrameworkElement bağımlılık özelliklerinde de değişiklikler dinlemem gerekiyor. Bu durumda, ne önerirsiniz? Gerçekten, gerçekten benim sınıfımın her örneğinde AddValueChanged kullanarak uygulamak denemek istemiyorum. Her ne kadar, herhangi bir performans isabeti olmadığı sürece PropertyChangedCallback'e rağmen sanırım bir şey olmaz. Ne yazık ki, bunun her açıdan verimli olması gerekiyor. – Giffyguy

İlgili konular