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

Raf*_*ael 4 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;
         } 
     }
}
Run Code Online (Sandbox Code Playgroud)

如果我在代码中设置Source

GifImage gifImage = new GifImage();
gifImage.Source = gifimage2;
Run Code Online (Sandbox Code Playgroud)

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

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

<my1:GifImage Stretch="Uniform" Source="/WpfApplication1;component/Images/Preloader.gif" />
Run Code Online (Sandbox Code Playgroud)

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

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

[Browsable(true)]
public new ImageSource Source
Run Code Online (Sandbox Code Playgroud)

但这仍然无效.

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

Rob*_*Rob 9

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

由于Image上的Source属性是DependencyProperty,当在XAML(和其他地方)中分配值时,它的值是使用

DependencyObject.SetValue(SourceProperty, value)
Run Code Online (Sandbox Code Playgroud)

一种可能的解决方案是覆盖DependencyProperty的元数据并添加更改侦听器,例如

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

    }

    private static void SourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        MessageBox("new source property");
    }
Run Code Online (Sandbox Code Playgroud)

或者替代地使用DependencyPropertyDescriptor

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