探讨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/firefox/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();
            // 初始化https://zhida.zhihu.com/search?content_id=228077413&content_type=Article&match_order=1&q=Xpcom&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NjI3OTI1MzAsInEiOiJYcGNvbSIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjIyODA3NzQxMywiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.K6lqKm-eB_95WALmR766JVVYDqG6gadfNPEuNIxtrdk&zhida_source=entity组件,指定Firefox文件夹的路径
            Xpcom.Initialize("C:\\Users\\自己的用户名\\Desktop\\Mozilla Firefox");
            // 创建一个https://zhida.zhihu.com/search?content_id=228077413&content_type=Article&match_order=1&q=GeckoWebBrowser&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NjI3OTI1MzAsInEiOiJHZWNrb1dlYkJyb3dzZXIiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjoyMjgwNzc0MTMsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.iiMx49LmtgCF4ZAReWdpuF0XAcsMZH24ZRXmu3qa7h8&zhida_source=entity对象,并设置其停靠样式为填充
            var geckoWebBrowser = new GeckoWebBrowser { Dock = DockStyle.Fill };
            host1.Child = geckoWebBrowser;
            // Navigate to a web page using the GeckoWebBrowser control.
            geckoWebBrowser.Navigate("https://www.bing.com");
        }
    }
}

别忘记添加using Gecko;

Xpcom.Initialize("C:\\Users\\自己的用户名\\Desktop\\Mozilla Firefox");

这个代码里面填写自己下载的火狐的路径,这个应当放在打包发布的文件夹中。

这样就可以使用了(亲自测试通过),具体的拓展使用方法就可以自己摸索了。

最后搞了半天,cefsharp,geckofx45,miniblink渲染的网页页面的文字都是模糊的,只有win7的ie8,webview2,微软自家的浏览器文字渲染才是最清晰的。所以针对win7电脑,首先考虑的应该是兼容ie8浏览器。哈哈

相关推荐
光泽雨16 小时前
WPF中的依赖属性
wpf
海马17 小时前
Spring Cloud 开发知识整理
spring·spring cloud·wpf
闻哥17 小时前
分布式任务调度框架:XXL-Job / ElasticJob / DolphinScheduler / SchedulerX 架构对比与选型
分布式·架构·wpf
波力海苔夹心脆6751 天前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net
慧都小妮子1 天前
Stimulsoft 2026.4 发布:Markdown 组件、桑基图与 .NET 11 支持
.net·数据可视化·stimulsoft·版本更新·报表控件·桑基图·.net 11
预立科技1 天前
CDN(内容分发网络)知识总结
网络·wpf·cdn
波力海苔夹心脆6752 天前
C# 视觉检测实战:PLC 按钮触发 VisionPro 检测,OK 亮灯 / NG 灭灯(西门子 PLC,含界面显示与图片存档)
开发语言·经验分享·c#·自动化·视觉检测·.net
hez20102 天前
一行代码在 .NET 项目里启用 Satori GC
c#·.net·.net core·gc·clr
FuckPatience2 天前
WPF DataGrid 行根据某个属性循环变色动画
wpf
QUDONG_biubiubiu2 天前
.NET Runtime 6.0/7.0/8.0/9.0下载修复教程,软件打不开这样解决
.net·net runtime下载·net运行库修复·net runtime安装