在WPF中扩展用户控件

10

我已经构建了一个用户控件,通常由XAML部分和代码后台部分组成。现在,我需要创建另一个用户控件,它与前一个控件共享一些功能,但外观不同,并且可能在代码后台中还具有其他功能。

我的第一个想法是创建一个接口来收集这两种类型控件的公共功能。这是正确的方法吗?我该如何管理应该有的不同 XAML 部分?欢迎提供任何建议。


听起来问题出在代码后端而不是控件本身。 - Ritch Melton
里奇,你是什么意思? - Tilvia
1
听起来你想改变视觉效果,但保持相同的行为或添加到它。所有这些行为代码都被困在代码后面,无法重用,这是一个问题。你是否熟悉展示者模式,比如MVVM? - Ritch Melton
准确无误!不,我是个初学者... - Tilvia
1
谷歌的MVVM和WPF。基本思想是你有一个“ViewModel”来表示视图状态(可能是你在代码后台中拥有的),并且可以在不同的视图中重复使用。通常的方法是通过数据绑定将它们连接起来。祝好运。 - Ritch Melton
3个回答

8
我想再添加一些内容,我认为可能对遇到与我相同情况的人有用。
如果您要创建的控件不是特别复杂,则另一种可能的解决方案是创建一个基础用户控件,其中包含您想要共享的常见特性:这种控件将完全由C#编写。实际上,这允许在由XAML和代码后台组成的用户控件中进行继承。在继承的控件的XAML中,而不是拥有以下内容的方式:
<UserControl> ... </UserControl>

您将会拥有

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

然后在代码后台,您还需要指定以下内容:

class MyExtendedControl : MyBaseControl

希望这能帮到你。

我认为这不是正确的方式。当我尝试时,我收到了错误消息:xyz不能成为XAML文件的根,因为它使用XAML错误进行了定义。 Microsoft在此处描述了如何从XAML生成的类派生。 - ffonz

2
用户控件在WPF中不太适合继承,你可以通过一些技巧使其工作,但总体来说,最好使用自定义控件。使用这种方法可以更容易地为继承的控件指定不同的XAML。开始使用自定义控件的最简单方法是将项目中的一个新项添加为“Custom Control(WPF)”类型,它会为您添加控件,并将XAML添加到Themes/generic.xaml中。
要从此控件继承,最简单的方法是添加另一个新的自定义控件(WPF),然后更改代码后台以从父控件而不是Control进行继承。

所以,如果我理解正确的话,您的建议是我应该有两个自定义控件继承自一个包含公共特性的第三个控件? - Tilvia
1
是的,如果你只有几个常见的特性,另一个选择是继续使用 UserControls,并使用附加属性或行为来处理共同的特性。 - Bill Reiss

2
有许多方法可以分割这些部件以便更容易地处理它们。
MVVM,正如评论中所提到的,依赖于数据绑定来将输入控件与逻辑分离。通过将实现了INotifyPropertyChanged接口的适当类设置为您控件的DataContext,您可以改变其行为。如果用法之间的差异不太大,您的DataContext类或ViewModel可以实现Visibility属性以显示和隐藏输入的不同部分。
另一种分解功能的方法是聚合。请参见StackOverflow 269496
您可以构建实现常见功能的较小控件,然后通过组合这些较小控件(即聚合它们)来构建更大的特殊用途控件。聚合将适用于代码后台和数据绑定方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接