- A+
如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的。
今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDialog的时候,走了点弯路。
需求:
在WPF中,实现调用颜色选择框的效果。
尝试1:
参考网上其他人的做法(基于.NET XXX),加入了以下引用。
发现编译不通过,VS提示一堆红线,代码很不舒服的样子。
同时,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。再试一把,成了。
项目构成+核心代码:
回头一望,既然,只是用Windows.Forms.ColorDialog,那duck不必摆在画面上(上图位置3),还要设置可见不可见之类的。
那就不要WindowsFormsHost吧,全写在后台代码里(上图位置4)。
又试一把,成了。
回头再望,既然WinForm那边的控件不要,那上述Winform项目也用不上了吧。
丢掉丢掉,全部丢掉。
双试一把,error如下:
于是乎,双下了一个结论:不使用Winform项目的控件,那Winform项目提供的功能就是这两个程序集了。
System.Windows.Forms;
System.Drawing.SolidBrush;
那尝试1中的程序集怎么不行呢?
尝试4:
去(上图位置4)的定义里看一看!结果呼之欲出,.net core平台的项目,用.net XXX的DLL,看来是不行啊。
手动加上上述引用,叒试一把,完美!
以上。