【发布时间】:2021-07-09 22:17:18
【问题描述】:
一年多前,我开始使用 Windows 窗体编写 .NET Framework 4.6.1 应用程序。当时我知道 WPF,但熟悉 Windows 窗体,它具有我需要的大部分控件。对于缺少的控件,我在 Windows 窗体中编写了两个,在 WPF 中编写了一个。所有这些都可以很好地共存,并将 WPF 控件容器化在一个元素宿主中。
本周我开始迁移到 .NET Core 3.1。我对项目副本的测试是积极的,实际迁移的初步结果也是如此。经过小的重构后,解决方案构建并运行没有问题。然后在 WinForms Designer 中打开主 UI 表单后出现 gremlin。回到 .NET Framework,我的所有自定义控件都出现在 Designer 的工具箱中,可以轻松拖放到表单上。在 .NET Core 中,只有我的 WinForms 控件出现在工具箱中,而不是我的 WPF 控件。由于设计器看不到该控件,因此将其从表单的设计器代码中剥离,留下一个空的元素宿主。
这是踢球者。还原设计器的更改后,接受对表单设计器代码的任何直接手动编辑,并且构建项目成功并运行良好。所以出于某种原因,Designer 不喜欢 WinForms 中的 WPF 控件。
我尝试过的事情:
- 在测试期间,我发现主 WinForms UI 需要将“UseWindowsForms”和“UseWPF”都设置为“true”才能编译项目。然后,我将“UseWindowsForms”参数添加到 WPF 用户控件库中。这导致控件出现在设计器的工具箱中,但尝试添加控件会导致此错误:“无法创建组件... Microsoft.DotNet.DesignTools.Client.DesignToolsServerException ...确保类型实现IComponent 并提供适当的公共构造函数。适当的构造函数要么不带参数,要么只带一个 IContainer 参数。” 并且代码中现有的 WPF 控件仍然被删除。
- 我将 WPF 控件从库复制到主 UI 项目,编辑了命名空间,并删除了库项目引用。结果与上述相同。
- 创建了一个新的 Windows 窗体用户控件库,将“UseWPF”添加到项目中,并将 WPF 控件复制到此库中。结果与上述相同。
- 回到我的项目的测试副本,我按照 Microsoft 的“try-convert”和“upgrade-assistant”指南进行操作。后者起初看起来很有希望,因为它替换、修改或删除了过时的引用和包。但是,没有成功。
- 使用 .NET Core 3.1 和 .NET 5 尝试了上述迁移步骤。结果相同。
我现在的重点是继续手动编辑表单的设计器代码。不适合大的变化,如果/当这个项目被传递给另一个开发人员时也不可持续。有什么想法吗?我应该尝试将 Windows 窗体 UI 移植到 WPF 吗?或者这仅仅是相对较新的 .NET Core Windows 窗体设计器的成熟度问题?
Visual Studio 版本:Community 2019 16.9.3
IComponent 错误截图: enter image description here
【问题讨论】:
-
我目前唯一的建议:要依赖新的 WF Designer,至少使用 .NET 5 作为目标,因为 3.1 版本的新 WF Designer 不完整/有问题。尝试迁移单个控件并通过将代码插入到已经针对 .NET 5 的干净新项目中手动使其工作。使其工作,然后比较 Designer 的代码,您会发现输出代码将与 Framework 的代码部分不兼容.这并不能解决整个问题,但有助于了解如何以最小的时间损失实现它。
-
好主意,@aepot。在这方面,作为一个实验,我创建了一个包含四个新项目的解决方案:.NET Core 3.1 WinForms、.NET 5 WinForms 和两个 WPF Control 项目来匹配。这一次,将“UseWPF”添加到 WinForms 项目并没有显示工具箱中的控件,但是将“UseWindowsForms”添加到控件中可以。但是,我仍然收到与以前相同的错误,附加错误“无法访问已处置的对象。对象名称:'AdornerWindow'。”