9

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

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

4

5 回答 5

8

你永远不应该修改.designer.cs. 时期。您的更改将被毫不留情地覆盖。

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

于 2013-04-23T05:58:44.797 回答
7

我认为其他答案过于简单。

首先,我完全同意编辑 .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只会生成一次。移动是安全的,正如其他人在其他地方推荐的那样(https://stackoverflow.com/a/6527072/1593924) ,如果您正在修改它或添加一个方法,将Dispose(bool)方法移出实际上会很有意义Dispose()理想情况下应该坐在旁边Dispose(bool)

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

免责声明:

  1. 也就是说,我只尝试过 VS 2010 Ultimate;您的里程可能会在上述 1-3 上有所不同,但只要 .designer 是 .designerDispose(bool)之外的部分类,4 应该是安全的#region。我还确保在弄乱它之前将 .designer 文件的最新好版本提交到源存储库中。

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

于 2014-02-28T18:53:01.847 回答
5

此说明适用于完整的 Designer.cs 文件。由于其中编写的所有代码都是自动生成的。

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

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

希望能帮助到你...

于 2013-04-23T06:02:02.610 回答
1

让designer.cs安静下来不仅可以防止您的更改被覆盖,而且还可以帮助其他开发人员说不会出现任何意外情况。话虽如此,我至少能想到一个例外,那就是帖子作者提到的一个例外:Dispose()方法的扩展。据我所知,此代码 - 一旦生成 - 将不会被覆盖。

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

于 2013-04-23T06:25:43.967 回答
0

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

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

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

请记住在覆盖的开头调用 base.Method()。

希望我的这点小经验能帮到你!

于 2013-04-23T06:16:28.237 回答