C# 扩展WPF控制类

C# 扩展WPF控制类,c#,wpf,xaml,inheritance,C#,Wpf,Xaml,Inheritance,我想用一些方法和变量扩展System.Windows.Controls.Image。但据我所知,WPF控制继承被认为是一种不好的做法 那么,创建UserControl是唯一的方法吗?我确实希望避免这种情况,因为它使元素的使用更加复杂(例如,您必须调用UserControl.Image.Source,而不是Image.Source) 是否有任何选项?使用和关联的PropertyChangedCallback方法来实现所需的功能如何。例如: public class ImageProperties

我想用一些方法和变量扩展
System.Windows.Controls.Image
。但据我所知,WPF控制继承被认为是一种不好的做法

那么,创建
UserControl
是唯一的方法吗?我确实希望避免这种情况,因为它使元素的使用更加复杂(例如,您必须调用
UserControl.Image.Source
,而不是
Image.Source

是否有任何选项?

使用和关联的PropertyChangedCallback方法来实现所需的功能如何。例如:

public class ImageProperties
{
    public static readonly DependencyProperty ByteEncodedStringProperty = DependencyProperty.RegisterAttached("ByteEncodedString", typeof(string), typeof(ImageProperties), new PropertyMetadata(null, ByteEncodedStringPropertyChanged));

    private static void ByteEncodedStringPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        Image image = sender as Image;

        if (image != null)
        {
            ImageSource imageSource = DecodeByteEncodedStringImage(args.NewValue);

            image.Source = imageSource;
        }
    }

    public static string GetByteEncodedString(DependencyObject obj)
    {
        return (string)obj.GetValue(ByteEncodedStringProperty);
    }

    public static void SetByteEncodedString(DependencyObject obj, string value)
    {
        obj.SetValue(ByteEncodedStringProperty, value);
    }
}

静态类中的扩展方法呢

例如:

public static class ExtensionMethods
{
    public static bool MyExtendedMethod(this System.Windows.Controls.Image source)
    {
        // do something
        return true;
    }
}

你可以公开一个名为
Source
的依赖属性,当你摆弄它时,它会触及你的内部
图像。Source
你能更具体地说明你想要什么方法和变量吗?“WPF控件继承被认为是一种糟糕的做法”-一点也不正确,事实是-WPF非常灵活,您几乎不需要对任何东西进行子类化。我从WPF控件(包括表单、标签、文本框、组合框等)中进行子类化没有问题。然后在表单上使用我的子类控件即可。所有事件和方法都按计划工作。任何在基类上改进的升级都会随之而来。“但是使用一个完整的用户控件会带来很多不必要的东西”——胡说八道。一个
FrameworkElement
对象可以说和另一个
FrameworkElement
对象一样慢,因为它们都有布局机制。这才是最重要的,没有什么额外的重要一个类你已经在你的第一句话中回答了你自己的问题:“我想用一些方法和变量扩展System.Windows.Controls.Image”。扩展控件,这正是OO的全部内容之一,WPF也不例外。是否可以通过这个概念添加方法?例如,我想在我的类中使用淡出公共函数,使图像能够播放特定的动画。这是一种可能的方法,但我更喜欢将特定的方法(如特定的动画,仅在一个类中使用)直接保留在类中。@JustLogin我对WPF不是很精通。IMMO,创建CustomImage类并从System.Windows.Controls.Image.继承;)