【问题标题】:Split old .NET code into designer partial class将旧的 .NET 代码拆分为设计器部分类
【发布时间】:2010-10-14 17:57:42
【问题描述】:

我正在开发一个较旧的 .NET 代码库,该代码库将所有设计器代码与我的代码(前部分类)填充到同一个代码文件中。

是否有机制告诉 Visual Studio 2008 返回并将设计器代码重构为 X.designer.cs 部分类文件?

【问题讨论】:

  • 我为自己编写了一个 Designer.cs 代码的剪辑器,这是手动完成所有操作或尝试自动化所有操作之间的一个很好的折衷方案。

标签: .net visual-studio


【解决方案1】:

我刚才所做的完全是手动的:

  1. 创建您的表单.Designer.cs
  2. 将其添加到 Visual Studio(右键单击,添加现有项)
  3. partial 关键字添加到您现有的类中。
  4. 命名空间与原始cs中的完全相同添加到yourform.designer.cs
  5. 在这个命名空间中,添加 class 定义(不要忘记包含 partial 关键字)。 不要在 Designer.cs 中向这个分部类添加继承和/或接口。
  6. 完成后,您就可以剪切粘贴以下内容了:

a) 删除您在原始 Winform 中可能拥有的 components 对象。如果应用程序是 .NET 1.1,您将拥有如下内容:

    /// <summary>
    /// Required designer variable.
    /// </summary>
    private Container components = null;

b) 在 Designer 类中添加一个新的 components 对象:

    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

c) 除非您有 特定 处置方法,否则这是标准。如果您没有任何形式的继承,我认为 base.Dispose 可以安全删除:

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose( bool disposing )
    {
        if ( disposing && ( components != null ) )
        {
            components.Dispose();
        }
        base.Dispose( disposing );
    }

d) 将#region Windows 窗体设计器生成的代码中的所有代码复制到新的 Designer.cs 类。

e) 您还应该复制all所有对象(您在设计器中使用的标签、texbox 等)的成员变量。

这应该就是全部了。保存并编译。

请记住,一个部分类可以在 N 个文件中拆分,但所有文件都必须共享相同的命名空间。

值得吗? 好吧,就我而言,我有一堆 huge winforms,其中包含大量代码和控件。每次我从设计师切换到设计师时,VS2008 都会爬行。这使代码视图更具响应性。我记得在获得响应代码之前必须等待 3-5 秒。现在需要 1…


更新:

执行步骤 1 到 5 并移动现有控件或添加新控件不会自动将任何内容移动到 Designer.cs 类。 新的东西进入了新的 Designer 类,但不幸的是,旧的东西仍然保留在原来的位置。

您还必须关闭并重新打开文件(在您添加/创建部分类之后),以便 VS 在设计器中正确绘制;不这样做可能会导致绘制空表格。

【讨论】:

  • +1 这是我在工作中对我们项目中的一些大型表单所做的。使得在没有表单设计器代码的情况下区分更改变得更加容易。
  • 我很惊讶你不得不经历这么多麻烦。一旦您在正确的命名空间中创建了分部类,就不需要再做更多了,因为设计器会序列化为代码(在分部类中)。这就是为什么如果你不是很小心它会覆盖手动更改的原因。如果您有更多这些事情要做,请尝试除了移动成员之外的所有事情。然后,在 Designer 中打开,更改一些琐碎的内容,然后保存。看看它是否至少移动了成员。
  • 我是这么想的,但是如果你执行步骤 1 到 5,你最终会得到一个空的部分类。在设计器中移动控件然后保存表单不会将任何内容移动到 Desginer 类。 (在求助于手动之前,我已经尝试了所有这些)。我在打字时再试一次。什么都没发生。会看到你必须移动的“最小”是多少。
【解决方案2】:

如果有人仍在寻找自动执行此操作的方法,那么有一个 VS 宏 here 可以为您完成大部分工作。

一个非常好的工具。

【讨论】:

  • 虽然此处发布的链接有效,但它会将您带到博客文章,该博客文章有一个用于实际宏的 DropBox 链接,不幸的是,该 DropBox 链接现已失效。
【解决方案3】:

我很幸运使用免费的独立应用程序DeCodEx(Designer Code Extractor)。

DeCodeEx 在 Visual Studio 项目中加载,检测哪些文件是 WinForms,并自动将设计器代码从原始 .cs.vb 文件拆分为新的 .designer.cs.designer.vb 文件。

对于大型项目,这比尝试自己手动拆分文件要容易得多。

【讨论】:

  • 感谢您的好建议。请注意,每个源文件在转换之前必须只有一个类定义。
  • 这可行,但该工具使用旧版本的 c# 和 vb.net 语言,因此匿名函数和预期 & _ 等某些功能不起作用。我使用过 vs 2019,所以在开始转换之前我必须替换类似的东西。该工具适用于 utf-8,我的一些文件采用其他编码,所以我也必须转换。 UTF-8 视觉工作室链接:[stackoverflow.com/questions/43800861/…
【解决方案4】:

要将 yourForm.designer.cs 合并到 yourForm.cs,请按照以下步骤操作

在记事本中编辑.csproj并添加以下代码

<Compile Include="yourForm.designer.cs">
    <DependentUpon>yourForm.cs</DependentUpon>
</Compile>

【讨论】:

  • 在最新版本的 VS.NET 中不需要这样做。至少,在 VS 2017 中。要将 .Designer.cs 添加到现有的旧表单中,我右键单击项目节点,选择“添加新项目”命令,输入文件的相应名称 - VS 将其添加为表单主文件的子节点,并在 .csproj 文件中自动创建了这个 键。
【解决方案5】:

旧 .NET 代码的解决方案文件是 2003/2005 吗?我已经尝试通过使用 VS2008 中的转换向导来完成您所说的事情。在转换期间,它应该尝试解析您的 .aspx 页面并为它们构建设计器文件。设计器生成器的问题是这些旧的 .aspx 页面格式错误,根本无法解析。

我已经意识到,也许尝试将旧的 ASP.NET 代码转换为 2.0 或 3.5 本身就是一个大型项目。我还没有找到一种有效的方法来从旧的现有代码中提取设计器代码,所以我也很乐意在这里了解解决方案。

【讨论】:

  • 我实际上正在开发一个 winforms 应用程序。据我所知,在转换到 VS2008 期间它甚至没有尝试过。
  • 哦,我的错。是的,我不确定你的情况;希望有人能带来有用的东西!
【解决方案6】:

如果是 WinForms - 我有一个 PowerShell 脚本,它可以编辑项目并为所有表单/控件添加 .designer.cs。

您仍然需要手动移动设计器代码(或改进脚本) - 我只有几个表单,而且不值得再添加这些。

如果有帮助,我可以查找并发布。

【讨论】:

  • 不,因为它不是完全自动化的,所以可能不值得麻烦。正如另一位评论者所说,这没什么大不了的。只是有点烦人。
【解决方案7】:

如果您在设计器中打开这些表单之一并保存它,我很想看看会发生什么;或修改并保存;或者在创建一个只有部分类的空壳的 .designer.cs 文件后执行上述操作之一。发现设计师至少将更改放入 .designer.cs 文件中,我不会感到惊讶。

【讨论】:

  • 我刚刚做到了。有一个旧的 winform (NET 1.1) 我在 VS2008 中用 .NET35 打开。我创建(记事本)designer.cs 并将其添加到 VS。 IDE 检测到它,但除非您添加“部分”并将类添加到 Designer.cs,否则 VS 将忽略它。两种形式必须在同一个命名空间中。我还必须更改 System.ComponentModel.IContainer;在 .NET 1.1 中是不同的。我复制/粘贴了 Dispose 方法、定义和 InitializeForm 方法。有效。如果表格一团糟,可能会很痛苦:)
  • 抱歉打错了:我刚刚做到了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2017-08-28
  • 2012-11-07
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多