一年多前,我开始使用Windows编写.NET Framework4.6.1应用程序。当时我知道WPF,但熟悉Windows窗体,它拥有我所需要的大多数控件。对于缺少的控件,我用Windows窗体编写了两个控件,用WPF编写了一个控件。所有这些都很好地共存,WPF控件被包含在一个元素主机中。
本周,我开始了向.NET Core3.1的迁移过程。我对项目副本的测试是阳性的,以及实际迁移的初步结果。在小规模重构之后,解决方案构建并运行,没有问题。然后,gremlin在WinForms设计器中打开主UI表单后出现。回到.NET框架中,我所有的自定义控件都出现在设计器的工具箱中,可以方便地拖放到窗体上。在.NET核心中,只有我的WinForms控件出现在工具箱中,而不是我的WPF控件中。由于设计器看不到该控件,因此它从窗体的设计器代码中删除它,留下一个空的元素宿主。
这是铁杆。在还原设计器的更改后,任何直接手工编辑表单的设计器代码都会被接受,并且生成项目会成功并运行良好。因此,出于某种原因,设计人员不喜欢WinForms中的WPF控件。
我尝试过的事情:
我现在的重点是继续手工编辑表单的设计器代码。对于大型更改并不理想,如果/当此项目传递给另一个开发人员时,也是不可持续的。有什么想法吗?我是否应该尝试将Windows窗体UI移植到WPF?或者这仅仅是一个相对较新的.NET核心Windows设计器的成熟度问题?
Visual版本:社区2019 16.9.3
IComponent错误的截图:在这里输入图像描述
发布于 2021-04-28 13:22:08
我终于想出了一个解决办法;这个想法是由ElementHost控件的Microsoft Docs页面:https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.integration.elementhost?view=netcore-3.1引发的。
本质上,将托管的WPF控件从主UI移动到WinForms控件库中。因此,这个WinForms控件库中的用户控件将是WPF控件的包装器。下面是我在测试和解决方案中所采取的步骤:
using System;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
namespace WinFormsLibrary
{
public partial class WpfTest : UserControl
{
// ElementHost for the WPF control
private ElementHost host = new ElementHost();
// WPF control to be hosted
private WpfControlLibrary31.TestControl31 uc = new WpfControlLibrary31.TestControl31();
public WpfTest()
{
InitializeComponent();
}
private void WpfTest_Load(object sender, EventArgs e)
{
// set the docking style for the ElementHost
host.Dock = DockStyle.Fill;
// add the WPF control as a child of ElementHost
host.Child = uc;
// add the ElementHost as a control of the panel container
panelWpf.Controls.Add(host);
}
}
}Thoughts
你的想法是什么?谢谢你的集思广益!
https://stackoverflow.com/questions/67098947
复制相似问题