手动编辑 *.designer.cs 文件

10

我知道,.designer.cs 文件包含了 Visual Studio 中的可视化窗体设计器生成的数据。然而,我有一些额外的方法,我也想把它们放到 .designer.cs 文件中,因为这些方法负责更低级别的窗体处理(例如,我的视觉状态管理器的部分)。

.designer.cs 文件中的 InitializeComponent 方法有一个注释说明它是自动生成的,不应该由用户修改。这个限制只适用于该方法吗,还是整个 .designer.cs 文件都不应该由用户编辑?我注意到,其中包括 Dispose() 方法,用户可能需要修改 - 这表明第一个选项。不过,我想确保一下。


2
当我需要修改表单的dispose方法时,我会将它从.designer.cs文件中剪切到.cs文件中。 - Jens Kloster
1
你可以在这里找到完整的说明:完整描述 - Mehdi
5个回答

10

永远不要修改 .designer.cs。这是绝对的,你的更改将会毫不留情地被覆盖掉。

更新:为了更加有帮助性,自从 C# 3(VS 2008)开始,已经包括了部分类方法,许多设计师现在会使用这些方法来让您实现自定义行为。


+1 确切!这些文件中的代码会在你使用Visual Studio查看表单布局时被覆盖。 - Jens Kloster
3
@JensKloster 嗯...不是的。它们没有被覆盖——我问这个问题,是因为我有一个编辑过的.designer.cs文件的项目,到目前为止我完全没有任何问题(我甚至修改了表单,并且我在.designer.cs中引入的方法也没有被删除)。但如果有可能会被覆盖,我宁愿把它们移动到一个单独的文件中。 - Spook
部分方法尚未被引入.NET,您正在谈论的是部分类。 - Virus
1
来自 MSDN 的内容:“部分类型中,部分方法的签名在一个部分中定义,而其实现则在该类型的另一个部分中定义。” http://msdn.microsoft.com/zh-cn/library/vstudio/6b0scde8.aspx - dahlbyk
@Spook 我几年前尝试过按照你所描述的方式操作。在我的情况下,当我第一次查看表单布局时,设计文件被覆盖了。如果你现在没有这个问题-太好了,但很有可能你最终会失去这些更改。 - Jens Kloster
显示剩余2条评论

7
我认为其他答案过于简化了。
首先,我完全同意编辑.designer文件几乎总是一个坏主意,但有一些情况下我这样做了,感觉很好,也没有遇到问题。
  1. Say I create a label and accidentally double click. Designer creates a method in my main .cs file which I then delete:

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

    Well, now the code won't build unless I also delete the following from my .designer file:

    this.label1.Click += new System.EventHandler(this.label1_Click);
    
  2. Less frequently, the order in which things are added to a form or panel (or menu!) matters, and it can be easier to change this order in the code than in the Designer GUI. In my experience VS 2010 always picks up on this, updates its GUI's info, and redraws its preview. Just remember to focus on the Add() methods--the order variables are declared in generally doesn't matter.

  3. Ditto if you set a property that causes a line to be added to the .designer file, deleting the line gets picked up quickly and Designer refreshes. Maybe it's wiser/safer to use the GUI to change the property, but I think deleting the line is cleaner.

  4. Code that is not inside this region, #region Windows Form Designer generated code, will only get generated once. It is safe to move, and as others have recommended elsewhere (https://dev59.com/ZFjUa4cB1Zd3GeqPTq5F#6527072), moving the Dispose(bool) method out actually can make a lot of sense, if you're modifying it or adding a Dispose() method that should ideally sit next to Dispose(bool).

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

免责声明:

  1. 话虽如此,我只尝试过VS 2010 Ultimate; 对于1-3,你的情况可能会有所不同,但只要.designer是一个带有Dispose(bool)在那个#region之外的部分类,4应该是安全的。在搞乱它之前,我还确保最新的好版本的.designer文件已经提交到源代码库中。

  2. 通过承认已经跟随Dispose(bool disposing)模式,我并不是想推广这种方法。在大多数情况下,似乎有好的 理由只使用Dispose(),并且对于非托管资源,每个资源都被封装在一个专用的可处理对象中,只需要做更多


5

这个指导适用于完整的designer.cs文件。因为其中的所有代码都是自动生成的,所以您不应该对此文件进行任何修改,因为它可以在任何时候重新创建...这将删除您的方法...

如果您想将代码与表单代码文件分开,请创建另一个文件,其中包含一个部分类,您可以在其中放置所有这样的方法...

希望这有所帮助...


1
保留 designer.cs 原始文件不仅可以防止您的更改被覆盖,还可以通过表明它不会出现意外情况来帮助其他开发人员。话虽如此,我至少能想到一种例外情况,那就是作者提到的一个:扩展 Dispose() 方法。据我所知,一旦生成了此代码,它就不会被覆盖。
然而,我认为更好的解决方案是重写 Dispose 方法,然后调用 base.Dispose(),这样我们可以使 designer.cs 保持清洁。

1
但请注意,Dispose() 不是生成的 #region 的一部分;它只会被生成一次,因此可以安全地移动它。 - Jon Coombs

0

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

方法InitializeComponent()无法被覆盖:它由设计器编辑器用于渲染您的表单的预览! 在一个新项目中尝试一下:调整表单大小,添加一个标签和一个按钮,然后重命名InitializeComponent()方法并重新编译。 您的表单将恢复默认大小!

如果您需要在表单加载时调用代码,只需重写OnLoad()虚拟方法;如果您需要在表单显示时调用代码,只需简单地重写OnShown()虚拟方法。

记得在重写方法的开头调用base.Method()。

希望这些经验能对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接