代码之家  ›  专栏  ›  技术社区  ›  cj32

WinForms背后的细分表单代码

  •  2
  • cj32  · 技术社区  · 6 年前

    在我最新的WinForms项目中,我的主窗体的代码开始变得太大,难以阅读。在我读过的其他帖子中,我看到过一些建议,说要创建另一个类,它是主窗体的部分类,然而,真正让我头疼的是,您创建的新类会自动生成另一个空白的设计窗口。我真的在寻找一种方法,将代码拆分为多个分部类,但只使用一个主设计窗口。

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

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

    Before making class a partial class:

    然而,当我将新类设置为Form1的部分类时,该文件将成为一个包含自己的设计窗口的表单。

    After making class a partial class:

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ron Beyer    6 年前

    这就是为什么你应该避免 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>
    

    因为当你添加 部分的 Visual Studio将其称为表单子类型,如下所示:

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

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

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

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

    enter image description here

        2
  •  0
  •   TheGeneral    6 年前

    在我最新的WinForms项目中,主窗体的代码 开始变得太大,难以阅读。

    这似乎是一个令人担忧的问题。

    在我读过的其他帖子中,我看到一些建议 假设创建另一个类,该类是主窗体的部分类

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

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

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

    而且,也许在一个 MVVM 模式,甚至 Decoupled 以各种其他方式。

    然而,如果不对代码进行深入分析,就很难真正了解

    使现代化

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