2010/12/02

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の需要は少ないのかな。

2010/11/27

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

最近CodePlexにプロジェクトを作って、暇な時にコードを書いているのだが、開発に使っているPCの1つがハードディスク障害で立ち上がらなくなってしまった。それはそれで障害ないとあきらめたけれど、問題はこいつでチェックアウトしてしまっていたファイル。壊れたPCでチェックアウトしているという情報がサーバで保持されているため、なんとも具合が悪い。会社でVS2005+TFS2005を使っていた頃、コマンドラインで強制アンロックとかできたよな、と思って調べてみると、VS2010でもtfコマンドで強制アンロックができた。コマンドは

tf undo /recursive /workspace:別PCで割り当てていたワークスペース名;ドメイン名\ユーザー名 $/

これでチームプロジェクト内の全ファイルのチェックアウトが解除される。ワークスペースはVSのソース管理エクスプローラで見れるし、

tf workspaces /owner:ドメイン名\ユーザー名 /computer:*

で、どのPCでなんというワークスペースを割り当てているかわかるから、これで調べてもOK。

ちなみに、tfコマンドはVS2010のインストールフォルダ内のCommon7\IDEにある。

2010/11/10

I'll be back to the .NET world presently

ようやく今の仕事も終わりが見えてきた。
そろそろ.NETの世界に戻ってこれる...はず。

2010/05/04

Silverlight 機能マトリクス : Silverlight 4 ではどんなことができるようになったか

この記事はこちらに移動しました。

WPF、Silverlight 関連は、今後このサイトに投稿します。

2010/05/03

StyleCop は更に有用なツールに進化していけるか?

2 週間ほど前のことになるが、Microsoft が StyleCop をオープンソース化することを決めたというアナウンスがあった。

 

StyleCop は C# のソースコードを分析し、コーディングルールに違反している部分がないか検査してくれるツールである。Visual Studio の拡張機能という位置づけで、インストールすると Visual Studio のメニューからソースコードの分析を実行できるようになる。似たようなツールとして FxCop があるが、こちらはソースコードをビルドしてできた中間言語 (IL) を分析するツールなので、守備範囲が異なっている。

 

StyleCop チームのブログによれば、ツールに対する好感と同時に、開発体制や機能についての改善要望も多かったようだ。

Since StyleCop was released publicly, there has been an overwhelmingly positive response from the C# development community. [...]  At the same time, many of you have complained about the slow pace of bugfixes and updates, about limitations in the license, and about some big things like a lack of support for VB.Net.

StyleCop を公開して以来、C# を使っている開発コミュニティから、圧倒的な好評を得ました。[...] 同時に、多くの利用者から、バグフィックスやアップデートの遅さ、ライセンスの制限、そして VB.NET をサポートしていないことへの不満があがっていました。

 

僕も StyleCop を使ってみたことがあるが、いくつか不満に思う点があった。

  • こちらからトリガーを与えないとソースコードの分析が実行されない。Eclipse + CheckStyle のように書いたそばから分析して欲しい。
  • 追加のルールを作るのが大変。
  • あと、知人に聞いた話だけど、Visual Studio のデフォルトのコーディングスタイル (Ctrl + E, D でフォーマットした時のコーディングスタイル) なのに、違反と判定されるものがあるらしい。

特に、最初に挙げた「書いたそばから分析」が欲しいと思っている。コードの分析にも、コーディングスタイル、他クラスのメンバーの使い方、クラスやメソッドの設計、セキュリティ上の懸念点など、いくつもの側面がある。その中で、コーディングスタイルのように、コードを書いているその場で指摘して欲しいものと、クラスやメソッドの設計のように、ある程度まとまった単位のコードを書いてから指摘してもらい、じっくり検討したいものとに分かれるはずだ。後者は、コードを書き終わった後にコンテキストメニューから実行するとか、ビルドのタイミングがちょうどいいが、前者の方は、少なくともファイル保存時、できれば書いている最中にすぐに分析してくれるとありがたい。前者のタイプの分析を StyleCop、後者のタイプの分析を FxCop という役割分担にするとよいのではないか、というのが個人的見解だ。

4/24 に、数週間で CodePlex に StyleCop プロジェクトをのせると言っていたので、そろそろコードが見れるようになるはず。ソースコードの分析・検証は自分にとって関心のある分野だし、開発にとって重要なものの 1 つなので、積極的にフィードバックしていこうと思っている。