WPF在XAML中的继承类中使用override属性

时间:2011-09-05 22:36:54

标签: c# wpf xaml

我有一点问题,找不到任何解决方案。也许这是Visual Studio中的一个问题。

我创建了一个继承自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;

然后Source将被正确设置为GifImage并显示MessageBox。

但是如果我在Xaml-Code中设置Source:

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

然后将设置Image的Source属性,并且不会显示MessageBox。

我的想法是设置System.ComponentModel.Browsable-Attribute,认为继承GifImage类中的属性在Visual Studio中不可见,并且它正在使用父类的source属性。

[Browsable(true)]
public new ImageSource Source

但这仍然无效。

有人有同样的问题或/和解决方案吗?

1 个答案:

答案 0 :(得分:9)

您无法在WPF中以这种方式覆盖DependencyProperty。

由于Image上的Source属性是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");
    }

或者替代地使用DependencyPropertyDescriptor

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