ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

WebBrowserコントロールつらい

こんなにつらいとは思ってませんでした。

こんなにつらいコントロール

Airspace問題

名前がついてしまうくらいにはよく知られた問題だったようです。WPFのWebBrowserは、ふつうのWPFのコントロールと違ってActiveXがうんぬんかんぬんでどういうわけか一部を除いてあらゆるコントロールの一番上にレンダリングされるようになっています。4.5では解決したとか話を聞いた気がするのですが気のせいだったようで、プロジェクトで使う.NET Frameworkを4.5に設定しても解決してないのでやっぱり解決してません。現状では対処が必要です。

既定ではレンダリングモードが制限されている

既定ではIE7相当の骨董品レベルに制限されています。なのでそのままAcid2テストに特攻すると失敗します。

つまり何も対策しないとこうなる

※編集時は画像が上になっていることに注目
f:id:yuu_xxxx:20140227232139p:plain
実行すると…
f:id:yuu_xxxx:20140227232150p:plain
一面血の海に…画像も切れています。

ではどうすればいいのか

Airspace問題の対処法

Microsoft先生の次回作にご期待ください
というわけではなく、一応の対処法があるようです。
Microsoft.DwayneNeed - Home
上のプロジェクトのソースをダウンロードしてビルドします。できたライブラリをいくつか参照に加えるといけます。
ひとまずMicrosoft.DwayneNeedとMicrosoft.DwayneNeed32があれば事足りるようです。それを参照に追加したあと
WebBrowserを

<interop:AirspaceDecorator AirspaceMode="Redirect"
                           Background="White"
                           IsInputRedirectionEnabled="True"
                           IsOutputRedirectionEnabled="True">
        <WebBrowser/>
</interop:AirspaceDecorator>

と囲えばOKです。ただし、この状態だとWPFデザイナーがずっこけるので作業中はコメントアウトしておくといいと思います。
参考:Webrowser Not Showing Up When Using MahApps.Metro Within' A C# WPF Project. · Issue #488 · MahApps/MahApps.Metro · GitHub

レンダリングモードの制限を解除する

Microsoft先生の次回作にご期待ください
ではなく、レジストリをごにょごにょします。Microsoftからのお達しです。
とりあえずお試しするには、レジストリエディタでいじればいいと思います。
「HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION」というキーに
(実行ファイルの名前)=(10進数でブラウザーのバージョン×1000)で制限加除できます。
とりあえず8000でも大丈夫なようで、これを設定すると一番新しいモードでレンダリングしてくれるみたいです。
参考:WebBrowserコントロールのIEバージョン - (。・ω・。)ノ・☆':*;':*
※こちらでも惨殺されたスマイリーが見れます。