【问题标题】:Manual editing of *.designer.cs file*.designer.cs 文件的手动编辑
【发布时间】:2013-04-23 05:57:25
【问题描述】:

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

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

【问题讨论】:

  • 当我需要修改forms的dispose方法时,我将其从.designer.cs文件中剪切到.cs文件中。
  • 你可以在这里找到完整的解释[完整描述][1][1]:stackoverflow.com/questions/32157898/…

标签: c# designer


【解决方案1】:

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

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

【讨论】:

  • 正好+1!一旦您使用 Visual Studio 查看表单布局,这些文件中的代码就会被覆盖。
  • 从技术上讲,您指的是部分。部分方法是完全不同的野兽。
  • @JensKloster Ammmm...不。它们没有被覆盖 - 我问,因为我实际上有一个项目,其中包含已编辑的 .designer.cs 文件,直到现在我没有任何问题(我什至修改了表单,并且没有删除我引入 .designer.cs 的方法)。但如果有可能的话,我宁愿把它们移到一个单独的文件中。
  • 部分方法还没有进入.Net 你说的是部分类
  • 来自 MSDN:“部分方法的签名定义在部分类型的一部分中,其实现定义在类型的另一部分中。” msdn.microsoft.com/en-us/library/vstudio/6b0scde8.aspx
【解决方案2】:

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

首先,我完全同意编辑 .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() 方法,将 Dispose(bool) 方法移出实际上会很有意义在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) 模式,并不是要推广这种方法。似乎有goodreasonssimply在大多数情况下使用Dispose(),对于非托管资源只有do more,每个资源都一对一封装在一个专用的Disposable对象中。

【讨论】:

    【解决方案3】:

    此说明适用于完整的 Designer.cs 文件。 因为里面写的所有代码都是自动生成的。

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

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

    希望对你有帮助...

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 但请注意 Dispose() 不是生成的#region 的一部分;它只会生成一次,所以移动它是安全的。
      【解决方案5】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-03
        • 2016-03-22
        • 2018-07-06
        • 1970-01-01
        相关资源
        最近更新 更多