我怎么能重用我的代码呢?

时间:2015-10-02 21:34:26

标签: wpf xaml code-behind

我有两个具有完全不同布局的控件,但它们的XAML结构非常相似(相同类型的容器甚至相同的元素名称),因此后面的代码是相同的。不幸的是,到目前为止,我不得不为这两个类中的每个类重复所有事件处理程序的代码。

我现在正在使用组合提取卫星类的常用功能,但构造函数,字段声明和初始化的冗余仍困扰着我。

所以问题归结为:

  

当两个UserControl只有布局差异但代码隐藏相同时,有没有办法避免代码背后的冗余代码?

4 个答案:

答案 0 :(得分:1)

WPF使用可以更改的controltemplate分离这些问题。 “代码隐藏”就是行为。您不需要ViewModel。

答案 1 :(得分:1)

解决方案很少:

  1. 创建从UserControl继承的抽象类。将公共逻辑放在BaseClass中。

    将“UserControl”更改为从BaseClass而不是UserControl继承。所以最后你将有两个从你的基类继承的UserControl。

  2. 考虑创建Control,而不是UserControl。您可以为控件创建两个ControlTemplates。

    <local:YourControl Template="{StaticResource Template1}" />
    <local:YourControl Template="{StaticResource Template2}" />
    
  3. 在MVVM中,您可以轻松地为单个视图模型创建多个视图。虽然有些人会遇到每个视图模型的单个视图,反之亦然,但您可以创建两个从一个公共库继承的视图模型,或者继承自FirstViewModel的SecondViewModel。

答案 2 :(得分:0)

您的要求实际上只有您自己知道。我要回答你强调的问题:

Is there a way to avoid redundant code behind code when two UserControls 
have only layout differences, but identical code-behind?

如果您希望灵活地分离不同布局的视图,那么最好选择松散的XAML文件。并在运行时加载这些文件。您可以在运行时更改这些文件,而无需更改应用程序代码。就像我们可以动态更改CSS / JS文件一样。

我开发了一个满足您需求的应用程序。我开发了3个用户控件:

  1. UserControl1:使用宽松的文本文件进行布局
  2. UserControl2:使用通用视图模型集中连接事件处理程序。但这可能不适合这里。
  3. UserControl3:使用松散的xaml文件进行布局
  4. 您可以检查,如果需要进行一些改进,我会这样做。

    Dropbox link

答案 3 :(得分:-1)

基于有限范围的最佳实践将是使用MVVM模式并将代码移动到适当的位置。

但是要回答你的问题,特别是,我会将代码分解为一个或多个可移植类库。根据应用程序的复杂程度,您可以将代码分解为项目中的类。