在WPF中扩展用户控件

时间:2011-11-20 16:16:54

标签: wpf user-controls

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

我的第一个想法是创建一个接口来收集两种控件的常用功能。这是正确的方法吗?我将如何管理我应该拥有的不同XAML部件?欢迎任何建议。

3 个答案:

答案 0 :(得分:8)

我想补充一点其他的贡献,我认为这对其他遇到同样情况的人有用。

另一种可能的解决方案,在我看来,如果您要创建的控件不是特别复杂,那么创建一个包含您想要共享的常用功能的基本用户控件:这样的控件将完全写入在C#中。 实际上,这允许在由XAML和后面的代码组成的用户控件中继承。在继承控件的XAML中,而不是

<UserControl> ... </UserControl>

你将

<MyProject: MyBaseControl x:Class="MyProject.MyExtendedControl"> ... </MyProject: MyBaseControl>

然后在后面的代码中你还需要指定以下内容:

class MyExtendedControl : MyBaseControl

希望这有帮助。

答案 1 :(得分:2)

用户控件不适合WPF中的继承,你可以做一些破解工作,但总的来说你可能会更好地使用自定义控件。使用此技术为继承的控件指定不同的XAML更容易。开始使用自定义控件的最简单方法是在类型&#34;自定义控件(WPF)&#34;的项目中添加一个新项目。它将添加控件,XAML将被添加到Themes / generic.xaml中。

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

答案 2 :(得分:2)

有许多方法可以分割各个部分,使其更易于使用。

MVHD,如注释中所述,依赖于数据绑定将输入控件与逻辑分开。通过将实现INotifyPropertyChanged的相应类设置为您控制的DataContext,可以更改行为。如果使用之间的差异不是很大,那么您的DataContext类或ViewModel可以实现Visibility属性以显示和隐藏输入的不同部分。

分离功能的另一种方法是通过聚合。见StackOverflow 269496

您可以构建实现通用功能的较小控件,然后通过组合较小的控件(即聚合它们)来构建更大的特殊用途控件,以实现更大的控制。聚合将适用于代码隐藏和数据绑定方法。