探讨vs2022在net6框架wpf界面下使用winform控件。
有很多好用的winform控件,在开发wpf界面的时候需要用上,例如在wpf中嵌入firefox或者cefsharp,虽然cefsharp也有wpf版,但是性能不太行,并且一直出现网页模糊的情况。所以还有有必要解决一下。
wpf下免费的嵌入浏览器的方案有以下几种:
1、微软自带的webview2。但是需要在客户端安装运行时并且需要win10以上,这个门槛就有点高了。
2、cefsharp,有wpf版,实际使用的时候出现了字体模糊的情况。cefsharp winform版
3、早起版本的firefox,geckofx45。
今天就重点介绍一下,怎么在vs2022,net6,wpf项目下嵌入早期版本的火狐浏览器
核心方案就是利用wpf中的<WindowsFormsHost Name="host1"/>控件来嵌入winform下的控件。
vs2022,net6,wpf项目默认是不支持这个控件的。
通过在stackoverflow上查询得到一个有用的方案,
Can't use System.Windows.Forms
总结一下,就是双击解决方案资源管理器中的项目文件
在配置文件中加入,<UseWindowsForms>true</UseWindowsForms>。并且平台需要调整成*86,因为后面用到的火狐浏览器用的是32位的。<Platforms>AnyCPU;x86</Platforms>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
<Platforms>AnyCPU;x86</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Geckofx-Core-45.0.36.02" Version="45.0.36" />
<PackageReference Include="Geckofx-Winform-45.0.36.02" Version="45.0.36.2" />
<PackageReference Include="Geckofx45" Version="45.0.34" />
</ItemGroup>
</Project>
然后将项目的框架从net6切换成net5,点击保存,关掉vs,再打开vs
这时候,vs里面就可以直接使用<UseWindowsForms>true</UseWindowsForms>控件了。
在能用之后就可以将目标框架改回net6了。(微软为了放弃一些旧的功能,真的是想尽办法阻挠。。。)
并且在开头的声明当中,也可以写入xmlns:wf="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
在xaml设计器中添加host
<Grid Name="grid1">
<WindowsFormsHost Name="host1"/>
</Grid>
现在就需要安装嵌入firefox的nuget包了,
安装上面三个包,要注意版本,core,winform都是45.0.36.02
然后还需要下载 http:// ftp.mozilla.org/pub/fir efox/releases/45.0.1/win32/zh-CN/
上面火狐浏览器的下载地址,45.0.1。这个版本和45.0.36.02是兼容等效的。
现在就是后台代码了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms.Integration;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Gecko;
namespace firefoxtestwpf
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
// 初始化Xpcom组件,指定Firefox文件夹的路径
Xpcom.Initialize("C:\\Users\\自己的用户名\\Desktop\\Mozilla Firefox");
// 创建一个GeckoWebBrowser对象,并设置其停靠样式为填充
var geckoWebBrowser = new GeckoWebBrowser { Dock = DockStyle.Fill };
host1.Child = geckoWebBrowser;