WPFアプリにアニメーションGIFを表示させる
WPFには画像を表示するためのImageというコントロールがあるけれど、アニメーションGIFには対応していないらしく、1フレーム目だけが静止画として表示されてしまう。何かソリューションはないのかと探したところ、以下のようなやり方があるようだ。
1. MediaElementを使う
<MediaElement Source=”パス” LoadedBehavior=”Play”/> と書くと、アニメーションGIFが表示できる。ただ、GIFファイルが埋め込みリソースになっているとだめなので、プロパティをいじって「出力ディレクトリにコピー」にしておかないといけない。見つけた中では一番シンプルなソリューションだったけれど、表示までに時間がかかる、アニメーションが途中で止まる、といった問題があり、すぐには解決できなかったので、次のPictureBoxを使う方法を採用することにした。
2. Windows FormsのPictureBoxを使う
アニメーションGIFを設定したWindows FormsのPictureBoxをWindowsFormsHostでホストすれば、WPFの画面にアニメーションGIFを表示できる。まずXAMLでこのように書いておき、
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:winForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Loaded="Window_Loaded" >
<Grid>
<wfi:WindowsFormsHost Loaded="WindowsFormsHost_Loaded">
<winForms:PictureBox/>
</wfi:WindowsFormsHost>
</Grid>
</Window >
WindowsFormsHost_LoadedイベントハンドラでGIFファイルを読み込めばOK。
private void WindowsFormsHost_Loaded(object sender, RoutedEventArgs e)
{
WindowsFormsHost host = (WindowsFormsHost)sender;
PictureBox pbox = (PictureBox)host.Child;
pbox.Image =Bitmap.FromFile(パス);
}
WPFなのにWindows Formsを使わなければいけないのがいまいち。WPFのImageで対応してほしい。
3. コントロールを継承
わざわざカスタムコントロールを作りたくなかったので今回は試さなかったけど、OnRenderをオーバーライドしてごにょごにょやるとアニメーションGIFを表示させられるらしい。
ところで、Google検索してもこれといった日本語の情報が出てこなかったけど、WPF+アニメーションGIFの需要は少ないのかな。
Comments
Post a Comment