部分类有多种形式

时间:2014-02-17 07:20:55

标签: c# winforms visual-studio partial-classes csproj

当我编写winforms应用程序时,我倾向于为每个表单创建一个 Implementation.cs 文件。

假设我有 Form1.cs ,我将从partial class Form1开始创建一个名为 Form1.Implementation.cs 的新文件。

Form1.cs 只包含所有事件回调方法(设计师已完成的工作),其他所有内容都包含在 Form1.Implementation.cs 中。它帮助我编写更易读的代码。


我希望 Form1.Implementation.cs 成为一个“子文件”,就像 Form1.Designer.cs 一样,所以我编辑了 .csproj 文件。

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

重新加载后, Visual Studio 会在<SubType>Form</SubType>元素之后立即自动添加DependentUpon。双击 Form1.Implementation.cs 不显示代码,而是显示另一个初始空表单的设计器。

就像

  

“class Form1 ,ISA 表单,是(?)多种形式。”

我尝试adding DesignerCategory attribute来分类 Form1 ,但它也会影响 Form1.cs

好吧,点击'Shift-F7'或'Ctrl-Shift-0'并不是什么大问题。 我想知道......

  1. 这是 Visual Studio 的小故障,
  2. 辅助(?)形式确实以某种方式存在,
  3. 有一天它会炸毁我的winforms项目

1 个答案:

答案 0 :(得分:2)

实现您尝试的方法的唯一方法是添加您已经知道的<DependentUpon>。现在,Visual Studio会自动为Form派生的任何类添加<SubType>Form</SubType>。由于 Form1.cs 可能包含行public partial class Form1 : Form,因此这是SubType的来源。

其他文件 - Form1.Designer.cs Form1.Implementation.cs 可能只包含partial class Form1,但由于多个文件中的部分类定义是仍然有效的一个类定义,Visual Studio检测到它仍然继承Form。我相信你可能已经知道了,但以防here's the MSDN article about the partial keyword。不要担心在这种情况下有Form的多个实例。请记住,这仍然只是一个类 - Form1,而不是你传播它的文件数量。

最后,包含继承Form(或UserControl)类(甚至部分!)的所有代码文件将在Designer中自动打开。这种行为是设计使然。

这里的解决方案很简单 - 要么创建一个代码文件来定义一个不基于Form的单独的类,要么只是使用F7在解决方案资源管理器中查看该文件的代码,无论多么令人讨厌。该代码文件是否<DependentUpon>无关紧要。只有FormUserControl的继承很重要。

在我看来,最好的解决方案是坚持Visual Studio给你的东西:

  • 设计器生成的代码保留在 Form1.Designer.cs
  • 您的代码(您在实施中添加的内容)进入 Form1.cs (点击F7查看该代码而不是去设计师)< / em>的

这是我的团队已经坚持了几年的方法。它提供了分离Designer代码和手动编码操作的基本方法。为了更好地分离您的代码,请使用设计模式,如MVP,如Simon Whitehead在评论中所建议的那样。