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