在WPF中扩展用户控件

在WPF中扩展用户控件,wpf,user-controls,Wpf,User Controls,像往常一样,我构建了一个由XAML部分和代码隐藏部分组成的用户控件。现在,我需要创建另一个用户控件,该控件共享前一个控件的一些功能,但具有不同的外观,并且可能在后面的代码中具有其他功能 我的第一个想法是创建一个界面来收集这两种控件的常见功能。走这条路对吗?我应该如何管理不同的XAML部件?欢迎提供任何建议。用户控件不适合WPF中的继承,您可以进行一些修改以使其正常工作,但总体而言,使用自定义控件可能会更好。使用此技术为继承的控件指定不同的XAML更容易。开始使用自定义控件最简单的方法是向项目中添

像往常一样,我构建了一个由XAML部分和代码隐藏部分组成的用户控件。现在,我需要创建另一个用户控件,该控件共享前一个控件的一些功能,但具有不同的外观,并且可能在后面的代码中具有其他功能


我的第一个想法是创建一个界面来收集这两种控件的常见功能。走这条路对吗?我应该如何管理不同的XAML部件?欢迎提供任何建议。

用户控件不适合WPF中的继承,您可以进行一些修改以使其正常工作,但总体而言,使用自定义控件可能会更好。使用此技术为继承的控件指定不同的XAML更容易。开始使用自定义控件最简单的方法是向项目中添加一个类型为“custom control(WPF)”的新项,它将添加该控件,并将XAML添加到Themes/generic.XAML中


要从该控件继承,最简单的方法是添加另一个新的自定义控件(WPF),然后将代码更改为从父控件继承,而不是从控件继承。

有许多方法可以拆分这些片段,以使它们更易于使用

如注释中所述,MVVM依靠数据绑定将输入控件与逻辑分离。通过将实现INotifyPropertyChanged的适当类设置到控件的DataContext中,可以更改行为。如果使用之间的差异不太大,DataContext类或ViewModel可以实现可见性属性来显示和隐藏输入的不同部分

分解功能的另一种方法是聚合。看


您可以构建实现公共功能的较小控件,然后通过组合较小的控件(即聚合它们)来构建较大的专用控件,从而生成较大的控件。聚合将适用于代码隐藏和数据绑定方法。

我想添加另一个贡献,我认为这可能对遇到同样情况的其他人有用

另一种可能的解决方案是创建一个基本用户控件,其中包含您想要共享的公共功能:这种控件将完全用C#编写。我认为,如果您要创建的控件不是特别复杂,那么这种解决方案是合适的。 事实上,这允许在由XAML和代码隐藏组成的用户控件中进行继承。在继承控件的XAML中,而不是

<UserControl> ... </UserControl>

希望这能有所帮助。

因此,如果我理解正确,您的建议是我应该从第三个自定义控件继承两个自定义控件,其中包含常见功能?是的,这是正确的,如果您只有几个常见功能,另一个选择是继续使用UserControls,并为常见功能使用附加属性或行为。听起来问题在于codebehind,而不是控件。Ritch,你是什么意思?听起来你想更改视觉效果,但使用相同的行为或添加到其中。所有这些行为代码都被困在代码背后,无法重用,这一事实导致了一个问题。您是否熟悉演示者模式,例如MVVM?准确地说!不,我是一个初学者…谷歌MVVM和WPF。其基本思想是,您有一个表示视图状态(可能是codebehind中的状态)的“ViewModel”,并且可以在不同的视图中重用。通常的方法是通过数据绑定将它们连接在一起。祝你好运
<MyProject: MyBaseControl x:Class="MyProject.MyExtendedControl"> ... </MyProject: MyBaseControl>
class MyExtendedControl : MyBaseControl