WPF использует свойство переопределения в наследуемом классе в XAML - PullRequest
4 голосов
/ 06 сентября 2011

У меня небольшая проблема, и я не могу найти решение. Может быть, это проблема в 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;

Тогда Источник будет правильно установлен на GifImage, и будет показан MessageBox.

Но если я установлю Source в Xaml-коде:

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

Тогда будет установлено свойство Source для Image, и MessageBox не будет показан.

Моя идея состояла в том, чтобы установить System.ComponentModel.Browsable-Attribute, полагая, что, возможно, свойство в наследуемом классе GifImage невидимо в Visual Studio и использует свойство source родительского класса.

[Browsable(true)]
public new ImageSource Source

Но это все еще не работает.

У кого-нибудь была такая же проблема или / и решение для этого?

1 Ответ

9 голосов
/ 06 сентября 2011

Вы не можете переопределить DependencyProperty таким образом в WPF.

Поскольку свойство 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");
   });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...