在 WPF/C# 中嵌入 Firefox/Gecko
Posted
技术标签:
【中文标题】在 WPF/C# 中嵌入 Firefox/Gecko【英文标题】:Embed Firefox/Gecko in WPF/C# 【发布时间】:2011-11-25 00:19:02 【问题描述】:我想在我的 WPF 项目中嵌入当前的 Gecko。 我知道 Winforms-Host 和 Skybound-Gecko-Library 有可能。
但我的应用程序没有使用标准的 wpf 主题。它是另一个,控件的滚动条不会被设置样式。此外,这是一个为 Firefox 3 设计的旧库。
在 WPF 中使用当前 Gecko 的最佳库/策略是什么?
【问题讨论】:
它必须是 FF 还是你只想要一个合适的浏览器? 不一定是ff,但最好。类似 skybound gecko 之类的功能还可以(基本导航和鼠标移动事件,用于读取光标处的 htmldom)。 IE 对我来说别无选择 【参考方案1】:你应该看看这些选项,它们都使用 Chromium:
付费:(基于 Awesomium)
http://awesomium.com/(对初创公司免费) http://wpfchromium4.codeplex.com/(使用 awesomium)免费:(基于 Chrome 嵌入式框架)
https://github.com/chillitom/CefSharp(提供 WinForms 和 WPF,但使用 CEF1) https://bitbucket.org/xilium/xilium.cefglue/wiki/Home(使用 CEF3,因此支持 Chrome 的多进程模型、flash 插件和 WebGL)【讨论】:
问题是关于 Gecko,而不是 webkit/blink 你是对的,但当时我给出了这个答案,没有使用壁虎的解决方案。而不是说我给了一个替代方案。 在回答之前我确实问过 OP。 你应该明白这一切都被谷歌索引并误导了很多搜索特定答案的人。不管怎样,这是我的看法,不想为之争吵:) @AlexLapa 它也被其他引擎索引;)也许原始海报可以回答有关嵌入 Google Chrome 的问题,但当我阅读他/她最初的问题时,这并不是很明显。【参考方案2】:WebKit.Net 是免费的:http://sourceforge.net/projects/webkitdotnet/
他们的 GitHub 页面似乎最近更新了:https://github.com/webkitdotnet
【讨论】:
【参考方案3】:你大概可以使用WindowsFormsHost,教程在这里
https://nhabuiduc.wordpress.com/2014/09/18/geckofx-net-webbrowser-setup-and-features/
有趣的是
WindowsFormsHost host = new WindowsFormsHost();
GeckoWebBrowser browser = new GeckoWebBrowser();
host.Child = browser;
gridWeb.Children.Add(host);
【讨论】:
这是我看到的唯一解决问题的答案。据我所知,Gecko 不能在“纯”WPF 中使用。我很高兴得到纠正。您必须使用 WPF WindowsFormsHost 嵌入基于 WinForms 的 Gecko 浏览器。【参考方案4】:这是我的答案。正如 Roman 所说,Gecko 是基于 Winforms 的,而不是基于 WPF 的,因此必须通过 WindowsFormsHost 合并。
创建 Visual Studio 项目后,通过 NuGet 安装 Gecko 包,使用命令:Install-Package Geckofx45
确保已将 WindowsFormsIntegration 和 System.Windows.Forms 引用添加到您的项目中。
在您的配置管理器中,将您的配置设置为 32 位,以消除编译器警告。
更新 MainWindow.xaml 'Grid' 元素,为其指定名称和“Loaded”事件的处理程序
<Grid
Name="GridWeb"
Loaded="Window_Loaded">
</Grid>
修改 MainWindow.xaml.cs 以合并 Gecko 并使其在加载时导航到页面:
public MainWindow()
InitializeComponent();
Gecko.Xpcom.Initialize("Firefox");
private void Window_Loaded(object sender, RoutedEventArgs e)
WindowsFormsHost host = new WindowsFormsHost();
GeckoWebBrowser browser = new GeckoWebBrowser();
host.Child = browser;
GridWeb.Children.Add(host);
browser.Navigate("http://www.google.com");
我很难使用 SO 代码编辑器,因此有关更详细的说明和屏幕截图,请参阅blog page。
【讨论】:
【参考方案5】:这是一个老问题,但我想出了一个伪解决方案,将 GeckoFX 添加为 XAML 标记,例如:
<local:GeckoBrowser Width="400" Height="250" />
这可以通过简单地将整个东西包装在一个 UserControl 中来完成,例如:
XAML:
<UserControl x:Class="WpfApp1.Browser"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Border x:Name="border" Background="Black" Margin="0"></Border>
</UserControl>
C#:
public partial class Browser : UserControl
WindowsFormsHost host = new WindowsFormsHost();
GeckoWebBrowser browser = new GeckoWebBrowser();
public Browser()
InitializeComponent();
Xpcom.Initialize("Firefox");
browser.Navigate("http://www.google.com");
host.Child = browser;
border.Child = host;
现在,您可以在 WPF 中使用该标签,在 UserControl 所在的同一个项目中。
我一直试图让它作为库中的控件工作,因此我可以轻松地将它移植到任何其他项目/解决方案,但它一直给我一个关于 mozglue.dll 丢失的错误。我怀疑这是由于 Xpcom.Initialize("Firefox") 但我需要进一步调查。
【讨论】:
以上是关于在 WPF/C# 中嵌入 Firefox/Gecko的主要内容,如果未能解决你的问题,请参考以下文章
WPF/C# 用 Newtonsoft 在重写 .json 之前有一个条件(if / else)(真 / 假值)