C# Forms AppプログラマのためのWPF(XAML)解説

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

2. コーディング

コードの記述は、基本的にWFAと同じです。ですが、動作部分は大きく変わっていきます。
ここから先は3つのグループ分けをします。

  1. WPF : フォームアプリケーション
  2. Silerlight: Webアプリケーション
  3. Windows Phone(以下「WP」)/Windows Store App(WPとほぼ同じ): モバイル/タブレット向け

この3つによってコーディングが大きく変わります。
ここでは詳細的なことは説明しません。各グループの詳細的なことは別記事にします。
今回の記事ではこの全てのグループに共通することを説明いたします。

1. 少しでも時間がかかる処理は全て非同期

大事なことなので先に紹介します。
Windows 4.0ぐらいから非同期に関する処理が大きく変わりました。最も大きな変化はawaitとasyncの追加ではないでしょうか。
WFAでの非同期といえばThreadとThreaadPool、そしてラムダ式。お手軽になったマルチスレッドを見てみましょう。

1. 非同期で実行するメソッドはasyncをつける
public async Task SampleMethod1(object parameter) {
    // 戻り値なし
}
//  又は
public async Task<object> SampleMethod2(object parameter) {
    // 戻り値あり(object)
    return new object();
}

非同期で実行するメソッドにはasync修飾子をつけ、戻り値にTaskを指定します。
もしも戻り値がない場合も、ジェンリック型ではないTaskを指定してあげたほうが良いです。voidも許可されていますが、好ましくなりません。
基本的に非同期メソッドは何もシなくても呼び出しただけで非同期で実行されます。
つまり、いえば SampleMethod1(); これだけでマルチスレッドで実行されます。
また、イベントも非同期メソッドを指定することができます。

2. 非同期メソッドを同期で実行する
asyncメソッドではない場合

asyncメソッド(非同期メソッド)ではない場合、ContinueWithを使用します。
Taskパラメータが1つのメソッド(又はラムダ式)を指定します。
Taskオブジェクトから結果を取得するにはResultプロパテイ
例外が発生している場合はIsFilltureプロパテイがtrueになり、Exceptionプロパテイにオブジェクトが格納されます。

asyncメソッドの場合

asyncの場合はawait修飾子をつけるだけで同期で実行されます。といってもそもそも非同期メソッド内で同期で実行されるだけなので非同期に違いはありません。
こちらの場合はそのまま戻り値を取得できます。例えばこんな感じ

object result = await SampleMethod2("parameter");

 2. プログラムの初めはProgramではなくApp

プログラムの開始はApp.xaml.csから行われます。
WPF(WPではない)の場合、App.xaml.csの中身はまっさらです。もし、いつもどおりargsがほしい場合はOnStartupをオーバーライドしましょう。
また、終了の際の動作を定義する場合はOnExitです。

3. 気になる点

さて、ここからは気になる点を幾つか上げていきます。

1. 起動が遅い

WPFはWFAよりも起動が遅いとよく言われますこれは仕方ないで割りきってください
WFAはフォームのデザインは普通にコードで行われますが、WPFではXMLライクなXAMLです。時間がかかるのは仕方ないことなのです。
そもそもWPFはビジュアル面で強いものです。例えばWFAではやりにくいグラデーションとかもWPFではらくらくです。また、アニメーションも存在します。WPFをせっかく使うならこの強みを活かしましょう。

2. アイコンが大量に必要になる

これはWPFには関係ないです。どちらかというとWP(Windows Phone)ですね。
自分で使用する際には必要はないですが、他の人用に配布する場合は様々なサイズのアイコンが大量に必要になります。
少なくとも私がアプリを作った際には10種類ぐらいのサイズのアイコンを用意しました。
これも仕方ないことだと割りきってください。頑張りましょう