我已经构建了一个用户控件,像往常一样组成一个XAML部件和一个代码隐藏部分。现在,我需要创建另一个用户控件,它共享前者的某些功能,但它们有不同的外观,并可能在代码隐藏方面具有其他功能。在WPF中扩展用户控件
我最初的想法是创建收集两种类型的控件的常用功能的接口。这是正确的路吗?我将如何管理我应该拥有的不同XAML部件?任何建议是受欢迎的。
我已经构建了一个用户控件,像往常一样组成一个XAML部件和一个代码隐藏部分。现在,我需要创建另一个用户控件,它共享前者的某些功能,但它们有不同的外观,并可能在代码隐藏方面具有其他功能。在WPF中扩展用户控件
我最初的想法是创建收集两种类型的控件的常用功能的接口。这是正确的路吗?我将如何管理我应该拥有的不同XAML部件?任何建议是受欢迎的。
我想补充的另一个贡献,我认为可能是别人遇到我一样的情况非常有用。
另一种可能的解决方案,在我看来,如果您要创建的控件不是特别复杂的话,那么这个解决方案就是创建一个基本的用户控件,其中包含您想要共享的常用功能:这样的控件将被写入完全使用C#。实际上,这允许在由XAML和后面的代码组成的用户控件中继承。在继承控制的XAML,而不是
<UserControl> ... </UserControl>
您将有
<MyProject: MyBaseControl x:Class="MyProject.MyExtendedControl"> ... </MyProject: MyBaseControl>
,然后在后面的代码,你还需要指定以下内容:
class MyExtendedControl : MyBaseControl
希望这可以帮助。
用户控件本身不能很好地继承在WPF中,你可以做一些处理,使其工作,但总体来说,你会使用自定义的控制,而不是可能会更好。使用这种技术为继承控件指定不同的XAML会更容易。开始使用自定义控件的最简单方法是向类型为“自定义控件(WPF)”的项目中添加一个新项目,并添加控件,并将XAML添加到Themes/generic.xaml中。
要从此控制继承,最简单的方法是添加另一个新的自定义控制(WPF),然后改变后面的代码从你的父母控件,而不是控制继承。
所以,如果我理解正确,你的建议是我应该有两个自定义控件继承第三个包含常用功能的控件? – Tilvia
是的,这是正确的,如果您只有一些常用功能,另一种选择是继续使用UserControl并使用附加的属性或行为作为常用功能 –
有许多的方式来分割的作品,使它们更容易使用。
MVVM,如在评论中提及,依赖于数据绑定到所述输入控制从逻辑分离。通过将实现INotifyPropertyChanged的适当类设置到您控制的DataContext中,您可以更改行为。如果两种用法之间的差异不太大,则您的DataContext类或ViewModel可以实现可见性属性以显示和隐藏输入的不同部分。
分解功能的另一种方式是通过聚合。请参阅StackOverflow 269496
您可以构建实现常用功能的较小控件,然后通过组合较小的控件(即聚合它们)来构建更大的特殊用途控件以实现更大的控件。聚合将适用于代码隐藏和数据绑定方法。
听起来像代码隐藏是问题而不是控制。 –
里奇,你是什么意思? – Tilvia
这听起来像你想改变视觉效果,但使用相同的行为或添加到它。所有这些行为代码都被困在代码隐藏之中并且不可重用的事实引发了一个问题。您是否熟悉演示者模式,例如MVVM? –