在 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的主要内容,如果未能解决你的问题,请参考以下文章

判断标签页显示隐藏(visibilitychange事件)

执行异步搜索的问题 (WPF/C#)

WPF/C# 用 Newtonsoft 在重写 .json 之前有一个条件(if / else)(真 / 假值)

将文件拖放到 wpf/C# 应用程序时,如何在 Windows 资源管理器中维护文件顺序?

循环检查网格中的复选框并获取标签值WPF c#

在 WPF / C# 中选择绑定项目后维护组合框文本