Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF在XAML的继承类中使用override属性_C#_Wpf_Xaml - Fatal编程技术网

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

C# WPF在XAML的继承类中使用override属性,c#,wpf,xaml,C#,Wpf,Xaml,我有一个小问题,找不到任何解决办法。也许这是VisualStudio中的一个问题 我创建了一个从Image继承的新类。然后重写源属性 class GifImage : Image { public new ImageSource Source { get { return base.Source; } set { MesssageBox("new source property");

我有一个小问题,找不到任何解决办法。也许这是VisualStudio中的一个问题

我创建了一个从Image继承的新类。然后重写源属性

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

但如果我在Xaml代码中设置源代码:

<my1:GifImage Stretch="Uniform" Source="/WpfApplication1;component/Images/Preloader.gif" />
但这仍然不起作用


是否有人有相同的问题或/和解决方案?

您无法在WPF中以这种方式重写DependencyProperty

由于图像上的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");
   });
}

对于第一个解决方案,我得到一个ArgumentException,即PropertyMetadata仍然按类型“Image”注册,我在SourceProperty中发现了错误;我必须使用我的控件类型来覆盖它。这里的类型(GifImage)太棒了,很高兴你能工作。我正要制作一个小应用程序来找出我做错了什么。我将更新答案以更改类型。
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image));
if (dpd != null)
{
   dpd.AddValueChanged(tb, delegate
   {
       MessageBox("new source property");
   });
}