WPFでCefSharp(Chromiumの.NET向け実装)を使う - 1

経緯

WPFにはデフォルトでウェブブラウザを扱うためのコンポーネントSystem.Windows.Controls.WebBrowserが用意されていて、簡単にウェブブラウザを埋め込んだアプリケーションの開発を行うことができます。

しかし、このWebBrowserコンポーネントはなかなか厄介で、以下のような問題を抱えています。

  • デフォルトでIE7互換のブラウザとして振舞う(IE11互換で動かすためにはレジストリの書き換えが必要)
  • UserAgent変えたりするのにアンマネージドなコードを触る必要がある
  • 一時ファイル類の操作がつらい(キャッシュやCookie消せないしそもそもどこにいるのかわからない)

単にウェブページを表示するだけのアプリであればWebBrowserコンポーネントで問題ないのですが、少し複雑なことをやろうとするとつらくなってきます。

なので、WebBrowser以外のWPFで利用可能なブラウザのコンポーネントを調べてみることにしました。

ちょっと分量が多くなりそうなので数回に分けて検証します。

Cefについて

CefはChromium Embedded Frameworkの略で、Chromiumをアプリケーションに組み込むためのフレームワークです。

bitbucket.org

Cefには各言語向けのラッパーがあり、その中のC#実装がCefSharpです。

github.com

CefSharpにはWPF対応のコンポーネントが用意されているので、それを利用してWebBrowserを置き換えることができるか検証してみます。

インストール

CefSharpはNuGetでインストールできるようになっているのですが注意すべきことがあります。

  • 2017/4/24現在の最新版は.NET4.5.2以上を要求する
  • Any CPUには対応していないので、プラットフォームをx86かx64にしておく(しておかないと参照がうまく追加されなくて手動で追加する必要がある?)

f:id:ghken:20170425001655p:plain

動かしてみる

適当に作ったWPFのプロジェクトのMainWindow.xaml.csにでも書いてみる。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var browser = new CefSharp.Wpf.ChromiumWebBrowser();
        browser.Address = "https://google.co.jp";
        Content = browser;
    }
}

f:id:ghken:20170425001703p:plain

URLの遷移について

ウェブブラウザを別のURLに遷移させる際、ChromiumWebBrowser.Addressを書き換える方法と、ChromiumWebBrowser.Load(url)を呼ぶ方法があります。

基本的な挙動に変わりはありませんが、ブラウザが初期化されていないときに実行すると挙動が変わります。

Addressを書き換えた場合

ブラウザの初期化後にそのURLに遷移する

Loadを呼んだ場合

初期化されていないので何も起こらない

まとめ

  • WPFでウェブブラウザを組み込んだアプリケーションを作りたいならWebBrowserを使う方法とCefSharpがある(ほかにもあるかも)
  • プラットフォームをx86/x64にしたWPFのプロジェクトにNuGetでCefSharp.Wpfを追加することでChromiumベースのウェブブラウザコンポーネントが利用できる
  • Load(url)やAddressで遷移できるけど初期化前の挙動に注意

次回はWebBrowserの各機能との対応を検証します。