経緯
WPFにはデフォルトでウェブブラウザを扱うためのコンポーネントSystem.Windows.Controls.WebBrowser
が用意されていて、簡単にウェブブラウザを埋め込んだアプリケーションの開発を行うことができます。
しかし、このWebBrowserコンポーネントはなかなか厄介で、以下のような問題を抱えています。
- デフォルトでIE7互換のブラウザとして振舞う(IE11互換で動かすためにはレジストリの書き換えが必要)
- UserAgent変えたりするのにアンマネージドなコードを触る必要がある
- 一時ファイル類の操作がつらい(キャッシュやCookie消せないしそもそもどこにいるのかわからない)
単にウェブページを表示するだけのアプリであればWebBrowserコンポーネントで問題ないのですが、少し複雑なことをやろうとするとつらくなってきます。
なので、WebBrowser以外のWPFで利用可能なブラウザのコンポーネントを調べてみることにしました。
ちょっと分量が多くなりそうなので数回に分けて検証します。
Cefについて
CefはChromium Embedded Framework
の略で、Chromiumをアプリケーションに組み込むためのフレームワークです。
Cefには各言語向けのラッパーがあり、その中のC#実装がCefSharpです。
CefSharpにはWPF対応のコンポーネントが用意されているので、それを利用してWebBrowserを置き換えることができるか検証してみます。
インストール
CefSharpはNuGetでインストールできるようになっているのですが注意すべきことがあります。
- 2017/4/24現在の最新版は.NET4.5.2以上を要求する
- Any CPUには対応していないので、プラットフォームをx86かx64にしておく(しておかないと参照がうまく追加されなくて手動で追加する必要がある?)
動かしてみる
適当に作った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;
}
}
URLの遷移について
ウェブブラウザを別のURLに遷移させる際、ChromiumWebBrowser.Address
を書き換える方法と、ChromiumWebBrowser.Load(url)
を呼ぶ方法があります。
基本的な挙動に変わりはありませんが、ブラウザが初期化されていないときに実行すると挙動が変わります。
Addressを書き換えた場合
ブラウザの初期化後にそのURLに遷移する
Loadを呼んだ場合
初期化されていないので何も起こらない
まとめ
- WPFでウェブブラウザを組み込んだアプリケーションを作りたいなら
WebBrowser
を使う方法とCefSharp
がある(ほかにもあるかも) - プラットフォームをx86/x64にしたWPFのプロジェクトにNuGetで
CefSharp.Wpf
を追加することでChromiumベースのウェブブラウザコンポーネントが利用できる - Load(url)やAddressで遷移できるけど初期化前の挙動に注意
次回はWebBrowserの各機能との対応を検証します。