部分类有多种形式
Posted
技术标签:
【中文标题】部分类有多种形式【英文标题】:A partial class has multiple form 【发布时间】:2014-03-16 09:20:06 【问题描述】:当我编写一个 winforms 应用程序时,我倾向于为每个表单创建一个 Implementation.cs 文件。
假设我有 Form1.cs,我将创建一个名为 Form1.Implementation.cs 的新文件,以 partial class Form1
开头。
Form1.cs 只包含所有的事件回调方法(设计者所做的),其他的都交给 Form1.Implementation.cs。它帮助我编写更具可读性的代码。
我希望 Form1.Implementation.cs 成为一个“子文件”,就像 Form1.Designer.cs 一样,所以我编辑了 .csproj 文件。
<Compile Include="Form1.Implementation.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
然而,在重新加载之后,Visual Studio 会自动在 DependentUpon
元素之后添加 <SubType>Form</SubType>
。双击 Form1.Implementation.cs 不会显示代码,而是显示具有另一个初始空表单的设计器。
好像
“类Form1,其中ISA Form,是(?)多种形式。”
我尝试将adding DesignerCategory
attribute 用于类Form1,但它也会影响Form1.cs。
嗯,按“Shift-F7”或“Ctrl-Shift-0”并不是什么大问题。 我想知道...
-
这是 Visual Studio 的故障,
次要(?)形式确实以某种方式存在,
有一天它会炸毁我的 winforms 项目
【问题讨论】:
您应该考虑采用更“架构化”的方法来处理您的代码。也许 MVP 会适合.. 你的 Form 只是变成一个愚蠢的视图,而实际的代码位于 Presenters 中。 该属性适用于Form1
类型,而不适用于其中一个源文件。实际上,部分类只存在于代码中,在编译时会被合并。
【参考方案1】:
实现您所尝试的唯一方法是添加您已经知道的<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)的类(甚至是部分!)的代码文件都会在设计器中自动打开。此行为是设计使然。
这里的解决方案很简单——要么创建一个代码文件来定义一个不基于Form 的单独类,要么只使用 F7 在解决方案资源管理器中查看该文件的代码,尽管这看起来很烦人。该代码文件是否为<DependentUpon>
并不重要。只有Form 或UserControl 的继承很重要。
在我看来,最好的解决方案是坚持使用 Visual Studio 为您提供的功能:
设计器生成的代码保留在 Form1.Designer.cs 中 您的代码(您在 Implementation 中放入的代码)进入 Form1.cs (按 F7 以查看该代码,而不是转到设计器)这是我的团队几年来一直坚持的方法。它提供了分离设计器代码和手动编码操作的基本方法。为了更好地分离您的代码,请按照 Simon Whitehead 在 cmets 中的建议,使用 MVP 等设计模式。
【讨论】:
以上是关于部分类有多种形式的主要内容,如果未能解决你的问题,请参考以下文章