2011-09-05 171 views
3

我有一個小問題,找不到任何解決方案。也許這是Visual Studio中的一個問題。WPF use override XAML中繼承類的屬性

我創建了一個從Image繼承的新類。然後我重寫Source屬性。

class GifImage : Image 
{ 
    public new ImageSource Source 
    { 
     get { return base.Source; } 
     set 
     { 
      MesssageBox("new source property"); 
      base.Source = value; 
     } 
    } 
} 

如果我在代碼

GifImage gifImage = new GifImage(); 
gifImage.Source = gifimage2; 

則源將被正確地設置爲GifImage和在MessageBox將顯示設定源。

但如果我設置源在XAML的代碼:

<my1:GifImage Stretch="Uniform" Source="/WpfApplication1;component/Images/Preloader.gif" /> 

然後將圖像的來源屬性設置,並在MessageBox不需額外顯示。

我的想法是設置System.ComponentModel.Browsable-Attribute,認爲繼承GifImage類中的屬性在Visual Studio中不可見,並且它使用父類的source屬性。

[Browsable(true)] 
public new ImageSource Source 

但是,這仍然無法正常工作。

有人有同樣的問題或/和解決方案嗎?

回答

8

您無法在WPF中以該方式重寫DependencyProperty。

作爲上的圖像的源屬性是一個DependencyProperty,當值在XAML(和其他地方)被分配它的值使用

DependencyObject.SetValue(SourceProperty, value) 

的一種可能的解決方案是覆蓋DependencyProperty的元數據被設定並添加更改偵聽器,例如

static GifImage() 
    { 
     SourceProperty.OverrideMetadata(typeof(GifImage), new FrameworkPropertyMetadata(new PropertyChangedCallback(SourcePropertyChanged))); 

    } 

    private static void SourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
    { 
     MessageBox("new source property"); 
    } 

或alternativly使用DependencyPropertyDescriptor

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image)); 
if (dpd != null) 
{ 
    dpd.AddValueChanged(tb, delegate 
    { 
     MessageBox("new source property"); 
    }); 
} 
+0

對於第一溶液我得到一個ArgumentException,該PropertyMetadata仍然由類型「圖像」 – Rafael

+0

註冊我發現的故障 在SourceProperty.OverrideMetadata(typeof運算(Image),新的FrameworkPropertyMetadata(新的PropertyChangedCallback(SourcePropertyChanged))); 我必須使用我的控件的typeof來覆蓋它。這裏typeof(GifImage) – Rafael

+0

太棒了,很高興你有它的工作。我正準備製作一個小應用程序來找出我做錯了什麼。我將更新答案以更改類型。 – Rob