WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

  • A+
所属分类:.NET技术
摘要

如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的。今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDialog的时候,走了点弯路。

如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的。

今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDialog的时候,走了点弯路。

 

需求:

在WPF中,实现调用颜色选择框的效果。

 

尝试1:

参考网上其他人的做法(基于.NET XXX),加入了以下引用。

发现编译不通过,VS提示一堆红线,代码很不舒服的样子。

WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

 

同时,WPF用的System.Windows.XXX命名空间下的控件,而WinForm用的是System.Windows.Forms.XXX下的控件。

很多控件名冲突了,要指定具体使用的命名空间。

于是乎,下了一个结论:需求嵌入的Windows.Forms.ColorDialog控件,单独放在一个pj里可好?

 

尝试2:

新建一个Winform项目(基于.Net 4.7.2),默认Form上,加一个ColorDialog,Form公开一个Color出去,等着wpf调用的时候用。

然后,wpf这边,加上WindowsFormsIntegration.dll和System.Windows.Form.dll引用,

XAML里声明命名空间:

xmlns:wfh="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:cdf ="clr-namespace:YMSL.CS4.FMS.FA.ColorDialog;assembly=ColorDialog"

 

再指定WindowsFormsHost

<wfh:WindowsFormsHost Grid.Row="0" Grid.Column="0" Name="WinFormHost1" Margin="0,0,0,0" >
<cdf:ColorChooserForm TopLevel="False" x:Name="colorChooserForm" Margin="0,0,0,0" FormClosed="colorChooserForm_FormClosed"></cdf:ColorChooserForm>
</wfh:WindowsFormsHost >

cs文件里,colorChooserForm_FormClosed实现,取得Winform公开返回出来的Color。

结果,还是有尝试1相同问题。

于是乎,又下了一个结论:难道是框架不一致?Winform项目,.NET Core 3.1支持吗?

 

尝试3:

上述Winform项目,改成基于基于.NET Core 3.1。再试一把,成了。

项目构成+核心代码:

WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

 

回头一望,既然,只是用Windows.Forms.ColorDialog,那duck不必摆在画面上(上图位置3),还要设置可见不可见之类的。

那就不要WindowsFormsHost吧,全写在后台代码里(上图位置4)。

又试一把,成了。

 

回头再望,既然WinForm那边的控件不要,那上述Winform项目也用不上了吧。

丢掉丢掉,全部丢掉。

双试一把,error如下:

WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

 于是乎,双下了一个结论:不使用Winform项目的控件,那Winform项目提供的功能就是这两个程序集了。

System.Windows.Forms;
System.Drawing.SolidBrush;

那尝试1中的程序集怎么不行呢?

 

尝试4:

 去(上图位置4)的定义里看一看!结果呼之欲出,.net core平台的项目,用.net XXX的DLL,看来是不行啊。

WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

 

 WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

 

 手动加上上述引用,叒试一把,完美!

WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

 

以上。