分解WinForms背后的表单代码

时间:2018-03-13 03:03:33

标签: c# winforms visual-studio-2017 windows-forms-designer partial-classes

在我最新的WinForms项目中,我的Main表单背后的代码已经开始变得太大而且难以阅读。在我读过的其他帖子中,我看到过建议创建另一个类的主要形式的部分类的建议,然而,真正让我感到困惑的是,您创建的新类会自动生成另一个空白设计窗口。我真的在寻找一种方法将我的代码分解为多个部分类,但只有一个主设计窗口。

例如,在下面的项目中,我的主窗口是Form1.cs。

当我第一次创建新的类文件(Form1Part2.cs)时,该文件显示为不包含自己的表单设计器窗口的c#类。 (这几乎是我想要的,除了它需要连接到Form1类,所以我可以访问它的控件和属性)

Before making class a partial class:

但是,当我将新类作为Form1的部分类时,该文件将成为包含其自己的设计窗口的表单。

After making class a partial class:

2 个答案:

答案 0 :(得分:0)

  

在我最新的WinForms项目中,我的主表单背后的代码有   开始变得太大而且难以阅读。

这开始时似乎很关注。

  

在我读过的其他帖子中,我看到了一些建议   比如创建另一个类,它是主窗体的部分类

这似乎更令人担忧,我认为没有太多理由这样做,只是看起来code-smelly

Separation of concernsDRY,创建帮助程序类(或其他),将表单中的问题抽象为可管理的逻辑问题。您甚至可以在以后找到一些可重用的,同时也从后面的代码中删除实际的真实逻辑。

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

此外,也许有些情况会以MVVM模式,甚至Decoupled以其他各种方式更好。

但是,如果不对代码进行深入分析,很难真正知道

<强>更新

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

答案 1 :(得分:0)

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

问题是您需要使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>

“神奇”部分就是这个:

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

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

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

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

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

完成此操作后,您的新.cs文件将与设计器和代码隐藏一起显示在Form1.cs下:

enter image description here