分解 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 下
在我最新的 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 下