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

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す