WebBrowserコントロールつらい
こんなにつらいとは思ってませんでした。
こんなにつらいコントロール
Airspace問題
名前がついてしまうくらいにはよく知られた問題だったようです。WPFのWebBrowserは、ふつうのWPFのコントロールと違ってActiveXがうんぬんかんぬんでどういうわけか一部を除いてあらゆるコントロールの一番上にレンダリングされるようになっています。4.5では解決したとか話を聞いた気がするのですが気のせいだったようで、プロジェクトで使う.NET Frameworkを4.5に設定しても解決してないのでやっぱり解決してません。現状では対処が必要です。
つまり何も対策しないとこうなる
※編集時は画像が上になっていることに注目
実行すると…
一面血の海に…画像も切れています。
ではどうすればいいのか
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バージョン - (。・ω・。)ノ・☆':*;':*
※こちらでも惨殺されたスマイリーが見れます。