我怎样才能在后面重用我的代码?

How could I reuse my code behind?

我有两个布局完全不同的控件,但它们的 XAML 结构非常相似(相同类型的容器,甚至相同的元素名称),因此 它们背后的代码是相同的。不幸的是,到目前为止,我不得不为两个 类.

中的每一个的所有事件处理程序重复代码

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

所以问题归结为:

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

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

但是为了回答您的问题,具体来说,我会将代码分解到一个或多个便携式 Class 库中。根据应用程序的复杂性,您可以将代码提取到项目中的 类。

WPF 使用可以更改的控件模板来分离这些问题。 "code-behind" 是行为。您不需要 ViewModel。

其实你的要求是什么,只有你自己知道。我正在回答你强调的问题:

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 文件进行布局

你可以检查一下,如果需要做一些改进,我会做的。

Dropbox link

解决方案很少:

  1. 创建从 UserControl 继承的抽象 class。将通用逻辑放在 BaseClass 中。

    比更改 "UserControl" 继承自 BaseClass 而不是 UserControl。所以最后你会有两个继承自你的 baseclass.

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

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