手动编辑* .designer.cs文件

我知道, .designer.cs文件包含Visual Studio中可视窗体设计器生成的数据。 但是,我还有一些额外的方法,我想将它们放入.designer.cs文件中,因为它们负责较低级别的表单处理(例如,我的可视状态管理器的部分)。

.designer.cs文件中的InitializeComponent方法有一条注释说明它是自动生成的,不应由用户修改。 此限制是否仅适用于该方法,或者用户.designer.cs不应编辑.designer.cs文件? 我注意到,除其他外,它包含Dispose()方法,用户可能想要修改 – 这表明第一个选项。 不过,我想确定一下。

你永远不应该修改.designer.cs 。 期。 您的更改将被无限制地覆盖。

更新:为了更有帮助,C#自v3(VS 2008)包含了部分方法,许多设计人员现在将使用这些方法来实现自定义行为。

此指令适用于完整的designer.cs文件。 因为所有编写的代码都是自动生成的。

您不应该对此文件进行任何修改,因为它可以随时重新创建…这将删除您的方法…

如果你想将代码与表单代码文件分开,那么我建议创建另一个文件,其中包含一个可以放置所有这些方法的部分类…

希望能帮助到你…

我认为其他答案太简单了。

首先,我完全同意编辑.designer文件几乎总是一个坏主意,但有一些情况我已经这样做了,感觉它是好的和正确的,并没有被烧毁。

  1. 假设我创建了一个标签并意外地双击。 Designer在我的主.cs文件中创建一个方法然后删除:

     private void label1_Click(object sender, EventArgs e) { } 

    好吧,现在代码不会构建,除非我还从我的.designer文件中删除以下内容:

     this.label1.Click += new System.EventHandler(this.label1_Click); 
  2. 不太常见的是,将事物添加到表单或面板(或菜单!)的顺序很重要,并且在代码中更改此顺序比在Designer GUI中更容易。 根据我的经验,VS 2010总是对此有所了解,更新其GUI的信息,并重新绘制其预览。 只记得关注Add()方法 – 声明的顺序变量通常无关紧要。

  3. 如果您设置了一个导致行添加到.designer文件的属性,则删除行会快速获取并且Designer会刷新。 也许使用GUI更改属性更明智/更安全,但我认为删除该行更清晰。

  4. 不在此区域内的代码, #region Windows Form Designer generated code region #region Windows Form Designer generated code ,只会生成一次。 移动是安全的,并且正如其他人在其他地方推荐的那样( https://stackoverflow.com/a/6527072/1593924 ),实际上移动Dispose(bool)方法可能很有意义,如果你正在修改它或添加一个理想情况下应位于Dispose(bool)旁边的Dispose()方法。

     protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); 

免责声明:

  1. 也就是说,我只尝试过VS 2010 Ultimate; 你的里程可能会在1-3以上变化,但只要.designer是在#region之外使用Dispose(bool)的部分类,4应该是安全的。 我还确保将最新版本的.designer文件提交到源存储库中,然后再将其搞砸。

  2. 通过承认已经采用了Dispose(bool disposing)模式,我并不是要推广这种方法。 在大多数情况下,似乎有充分的 理由 简单地使用Dispose() ,并且只对非托管资源执行更多操作 ,每个资源都在专用的Disposable对象中进行一对一封装。

将designer.cs放在一边,不仅可以防止您的更改被覆盖,还可以帮助其他开发人员说不会出现意外情况。 话虽如此,至少有一个我能想到的例外,那就是post的作者提到的一个例子: Dispose()方法的扩展。 据我所知,这段代码 – 一旦生成 – 将不会被覆盖。

但是,在我看来,更好的解决方案是覆盖Dispose方法,而不是调用base.Dispose() ,这样我们就可以使designer.cs保持干净。

部分设计器表单类,Visual Studio使用它来放置构建控件所需的所有代码。

方法InitializeComponent()不能覆盖:设计器编辑器使用它来渲染表单的预览! 尝试新项目:调整表单大小,添加标签和按钮,并重命名InitializeComponent()方法+重新编译。 您的表单恢复为默认大小!

如果需要通过表单加载来调用代码,只需重写OnLoad()虚方法,如果需要通过表单显示调用代码,则简单覆盖OnShown()虚方法。

记得在覆盖开始时调用base.Method()。

希望这一点点我的经验可以帮到你!