分解 WinForms 背后的表单代码

Break down form code behind WinForms

在我最新的 WinForms 项目中,我的主窗体背后的代码开始变得太大且难以阅读。在我通读的其他帖子中,我看到建议创建另一个 class,它是主表单的一部分 class,但是,真正让我烦恼的是新的 [=32] =] 您创建的自动生成另一个空白设计 window。我真的在寻找一种方法将我的代码分成多个部分 classes 但只有一个主要设计 window.

例如下面的项目,我的主要Window是Form1.cs。

当我第一次创建新的 class 文件 (Form1Part2.cs) 时,该文件显示为不包含自己的表单设计器 window 的 c# class . (这几乎是我想要的,只是它需要连接到 Form1 Class,这样我才能访问它的控件和属性)

Before making class a partial class:

但是,当我将新 class 设为 Form1 的部分 class 时,该文件变成了包含其自己的设计 window 的表格。

After making class a partial class:

In my latest WinForms Project, the code behind for my Main form has started to become too large and difficult to read.

这似乎令人担忧。

In other posts that I have read through, I have seen suggestions that say to create another class that is a partial class of your main form

这似乎更令人担忧,我看不出有什么理由这样做,只是看起来 code-smelly

Separation of concerns and DRY,创建助手 类(或其他),将表单中的关注点抽象为可管理的逻辑关注点。您甚至可能会发现其中一些可以在以后重复使用,同时还可以从后面的代码中整理出实际的真实逻辑。

即使它只是形式相关,我发现可读代码和 类 比 10000 行代码更容易理解,我相信它可以从逻辑上分解。

此外,也许其中一些在 MVVM pattern, or even Decoupled 中以其他各种方式变得更好。

但是,如果不对您的代码进行深入分析,很难真正了解

更新

抱歉,我刚刚看到你在 Winforms,所以 MVVM 评论可能有点无关紧要

这就是为什么你应该避免 partial classes,除非你正在编写代码生成器...

问题是您需要使 Form1Part2.cs 依赖于 Form1.cs,唯一的方法是编辑项目文件:

  <ItemGroup>
    <Compile Include="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Include="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
    <Compile Include="Form1Part2.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <EmbeddedResource Include="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
      <SubType>Designer</SubType>
    </EmbeddedResource>
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
    <Compile Include="Properties\Settings.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
    </Compile>
  </ItemGroup>

"magic"部分是这个:

<Compile Include="Form1Part2.cs">
  <DependentUpon>Form1.cs</DependentUpon>
</Compile>

因为当您将 partial 添加到您的代码并重命名它包含的 class 时,Visual Studio 有助于将其称为表单子类型,如下所示:

<Compile Include="Form1Part2.cs">
    <SubType>Form</SubType>
</Compile>

这会导致在您单击时加载设计器,并且因为它没有依赖项或 .designer.cs 文件,所以表单设计器不会加载您正在设计的实际表单,只是一个空白的设计器(如果你向它添加控件,它会出现在部分 class 中并创建一个额外的 RESX 文件,导致各种问题)。

更改 XML 使您的 Form1Part2.cs 成为 Form1.cs 的依赖项。您只能通过手动编辑 .csproj 文件来执行此操作。最简单的方法是在记事本中打开它,但您可以在 Visual Studio 中编辑它,方法是右键单击它,卸载项目,然后再次右键单击并 select "Edit xxx.csproj"。进行更改,然后右键单击该项目并重新加载它。

完成此操作后,您的新 .cs 文件将与设计器和 code-behind:

一起出现在 Form1.cs 下