我有一点问题,找不到任何解决方案。也许这是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
但这仍然无效。
有人有同样的问题或/和解决方案吗?
答案 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");
});
}