Last Updated 2011/09/21
WPF とは何かを検索キーワードにして、WEB サイトをあたると多くのサイトにヒットしますが、これはと思うサイトは少ないですね。一番多いのは Microsoft の言い分、つまり、バラ色の言葉の羅列です。私が知りたいことは Microsoft がいうように、本当に次世代の Windows アプリケーション対応の開発環境なのかどうかです。
Windows アプリケーション開発の方向性について、Microsoft は、WPF が Windows アプリケーションの UI の未来だと考えています。 しかし、2011 年の時点においても、WPF が主流になったという実感はありません。
私はいくつかの WPF アプリケーション(その一部を Software のページで公開しています)を作りました。たしかに、従来のプログラミング手法とは相当に異なりますので、WPF を敬遠したくなる気持ちは理解できます。しかし、ビジュアルコントロールなどを自由に、しかもかなり簡単に作ることができるなどのメリットは相当に高いものと考えます。
一つハッキリしていることは、WPF が Windows アプリケーションの未来形であるとの Microsoft の言にいつわりはないということです。WPF にすべきかどうかに迷っている人に対して、食わず嫌いにだけはならないようにとアドバイスしたと思います。
WPF とは何かに対する Microsoft の答えは、Visual Studio 2008 のヘルプの「Windows Presentation Foundation の概要」(Visual Studio 2010 の場合は、「WPF の概要)の項にある以下の文章の中にあります。
「Windows Presentation Foundation (WPF) は、魅力的な外観のユーザーエクスペリエンスを持つ Windows クライアントアプリケーションを作成するための次世代プレゼンテーションシステムです。」
日本語に翻訳したものだけでは頼りないので、原文も収録しておきます。
"Windows Presentation Foundation (WPF) is a next-generation presentation system for building Windows client applications with visually stunning user experiences."
「ユーザーエクスペリエンス」は、アメリカ人ならすぐに理解できるのかもしれませんが、日本人にはピンとこない表現です。エクスペリエンス "experience" は、「経験」とか「体験」のほかに、「経験によって習得した知識・技術」という意味もあります。
"stunning" の "stun" は「スタンガン」のそれと同じものです。「気絶する」のほかに「喜びや驚きで動転する」という意味もあります。つまり、"stunning" は「ドキッとするような」ぐらいでいいと思います。
WPF の SDK の中に、「ユーザーエクスペリエンス」という表現は複数の箇所に出てくるので、それらを勘案して上記の文章を書き直すと、「WPF は、ユーザーが今まで経験していないようなドキッとするような外観を持つ Windows クライアントアプリケーションを作成するための次世代プレゼンテーションシステムです。」でどうでしょうか。
次に、「プレゼンテーションシステム」です。「プレゼンテーション」は商品や企画のプレゼンテーションという使い方で、スッカリ日本語になっていますので、その意味については迷いはないと思います。しかし、「プレゼンテーション」するものは何か、プレゼンテーションする相手は誰か。これに対する答えは、Microsoft のサイトで公開している MSDN の「Windows Presentation Foundation の紹介」の中にあります。要するに、アプリケーションの使用者であるユーザーがアプリケーションを評価するときの最大のポイントは見た目のユーザーインターフェースである。アプリケーションが上記で紹介したユーザーエクスペリエンスなユーザーインターフェースを持てばユーザーへのアピール度合いが向上する。このような手段を提供する仕組みが、「プレゼンテーションシステム」というわけです。
ここまでで、WPF とは何かについては解決しました。次に、WPF の肝(キモ)について考えてみましょう。これについては、Visual Studio 2008/2010 のヘルプの [.NET の開発]-[.Net Framework SDK]-[.Net Framework]-[Windows Presentation Foundation]-[WPF の基礎] の「アーキクテクチャ」の項の「WPF アーキテクチャ」が比較的分かりやすいと思います。この記事を含めて私なりにまとめると重要なキーワードは以下のようになります。
それぞれのキーワードごとに解説を補足しましょう。
従来のプログラミングスタイルは、ユーザーインターフェース(以後、UI と称する)と実装部とをアプリケーション開発者が両方を担当しますが、UI 部をユーザーエクスペリエンス、つまり、魅力的にするには専門的な知識やテクニックが必要になります。そこで、UI 部と実装部とを別々に設計できれば都合がいいですね。WPF では UI 部に XAML を採用し、実装部とはデータバインディング、イベント、コマンド(これも新しい概念)を通じて連携しようとするものです。
なお、Visual Studio 2010 の IDE は WPF アプリケーション用フォームデザイナを持ちますが、その性能は十分とはいえません。実用的なアプリケーションを作るには XAML コードを直接編集することになると思います。一方、Microsoft は Microsoft Expression Blend という XAML を編集するツールを販売しています。ビジュアルな編集をするにはこれを利用するほかないと思います。
現在、私は Visual Studio 2010 を使っていますが、フォームにコントロールを配置するとき、フォームデザイナを利用しません。また、Expression Blend も使っていません。XAML を直接編集しています。WPF は自由度が高すぎるため、フォームデザイナがその機能のすべてを引き出すことができていないと感じるからです。要するに、フォームデザイナを使うほうが手間がかかると思います。
ところで、WPF アプリケーションを作るに際して、XAML は必須ではありません。つまり、C# コードだけで作ることができます。しかし、WPF アプリケーションは XAML を使うことを前提にして設計されていますので、XAML を使うほうが便利にできていることは間違いありません。私自身、実際に XAML を直接編集して見ると、C# コードを使うよりも簡単ではないかと感じています。逆に言うと、UI 部をすべてコードだけで構築しようとすると、コード量が多くて相当に大変な作業になります。
.Net Framework はいろいろなプログラミング言語が使えるので、C# と Visual Basic とに限りませんが、いずれにしろ、実装部は .Net Framework 的なコーディングが可能です。ただし、プログラミングスタイルは似て非なるもので、Windows フォームアプリケーションの作成と同じつもりでいると足元をすくわれることになります。つまり、WPF のクラスライブラリは .Net Framework の中に含まれていますが、設計思想はまったく異なりますので、従来のものとは別物と考えたほうがいいでしょう。
現に、まったく同じ機能のクラスを新規に作成しています。enum 型や構造体を含めてです。
たとえば、コントロールに Width と Height プロパティとがありますが、Left と Top プロパティはありません。または WndProc メソッドがありません。Graphics クラスもないなど、最初はどこから手を付けていいか分からないほどです。つまり、WPF アプリケーション用フォームのデザイン方法は従来のものとはまったく異なり、コントロールの配置はパネルコントロールを中心とするコンテナコントロールの制御の下になければなりません。
また、のちに説明しますが、データバインディングが重要で決定的な位置にありますので、これを使いこなせなければ WPF アプリケーションを作ることはできないか、相当に面倒になることも付け加えておきます。
これは否定的な意味で言っているのではありません。むしろ、積極的に使うほうが WPF アプリケーション開発手法の思想にあっていると思います。逆に言うと、WPF が面倒だと感じる要因にもなっています。
Windows アプリケーションの最大の弱点はグラフィックス関係にあります。とにかく遅いので、高速で動作しなければならないゲームソフトなどではどうにもなりません。そこで、Microsoft は DirectX を導入しました。"direct" は CPU を経由することなく、グラフィックスカードを直接動かすという意味だと理解していますが、WPF アプリケーションの作成時に DirectX を意識する必要はありません。
クラス名などは DirectX の影響を受けていますので、.Net Framework 2.0 までの名前付け規則の延長線上にないのは困りものです。このほうがいいと思ったのでしょうか。DirectX を知らないものから見ると、首をかしげざるをえないものもあります。
さて、WPF はすべての描画処理に DirectX エンジンを使うことで高速化を実現し、合わせて、3D 表示も可能になりました。また、アニメーションや動画・音声などのマルチメディアをサポートします。さらに、ベクターベースの描画をサポートするので、解像度に依存しない描画が可能です。
WPF は Flash を意識していることは間違いないと思います。Flash は企業系のサイトにいくと、画像がアニメーションするなどの視覚効果を提供しますが、WPF は Flash の機能をすべて(?)カバーするだけでなく、Flash を上回る機能を提供します。ただし、動作環境は Windows でなければならないという制限はありますが。
Visual Basic が登場した頃、イベントドリブンという言葉が出てきましたが、データドリブンは初めて聞く言葉です。データというとデータベースから読み込むデータとか、入力したデータを思い浮かべますが、そうではなくプロパティ値と考えていいようです。UI 部は XAML を使うので、XAML の内部からメソッドを呼び出すことはできません。そこで、通常のアプリケーションならメソッドを使うところをプロパティでまかなおうという作戦です。
WPF には Font クラスがありません。したがって、コントロールにも Font プロパティがありません。そのかわり、FontFamily、FontSize、FontStyle などのプロパティを個々に設定することになります。WPF のアプリケーションの設定などの情報は XML 形式のデータとして保存しますので、プロパティ値はテキストでなければなりません。したがって、Font オブジェクトをプロパティ値として設定することができないというわけです。
百聞は一見にしかず、コード例を見てもらえば、データドリブンの意味を理解してもらえると思います。以下は、XAML だけで作った WPF アプリケーションです(C# コードは 1 行も書いていません)。
Visual Studio を起動し、WPF アプリケーションを作成するプロジェクトを起こします。Window1.xaml に以下のコードをコピーしてください。これ以外のコードを書く必要はありません。実行してスライドコントロールを表示すると、テキストボックスに値を表示します。
<Window x:Class="SliderTest.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" Background="LightBlue"> <Grid> <TextBox Height="24" HorizontalAlignment="Left" Margin="30,19,0,0" Name="textBox1" VerticalAlignment="Top" Width="72" Text="{Binding ElementName=slider1, Path=Value}"/> ← ここでデータバインディングしている <Slider Height="22" Margin="28,64,20,0" Name="slider1" VerticalAlignment="Top" /> </Grid> </Window>
System.Windows.Forms.TrackBar コントロールを使う従来型のアプリケーションでは、ValueChanged イベント内でデータを設定するためのコードを書くところですが、データバインディングを使うことでプロパティ値を直接設定できます。
Microsoft のいうユーザーエクスペリエンスなアプリケーションとはどんなものかを具体的に思い浮かべるのは難しいので、公開されている WPF アプリケーションを紹介します。といっても実用的なものではなく、デモソフトといっていいものです。
http://windowsclient.net/downloads/folders/wpfsamples/entry3754.aspx
このページの右側にある "Control Info" の [Download] を選択して、Healthcare_Prototype.zip をダウンロードしてください。これは、コンパイル済みのアプリケーションとともにソースファイルも含みます。
従来のプログラミング手法でこれと同等のものを作ろうと思うとかなりの熟練を要しますが、WPF であれば比較的容易に実現できます。
このページの冒頭で、WPF が次世代の Windows アプリケーションの開発環境かどうかが問題だと述べました。UI 部を構築するにはかなりの知識と慣れを必要としますが、チョットしたアニメーションやきれいな画面構成は、実務的なアプリケーションであっても遊び心があって望ましいものです。
WPF は .Net Framework の中にありますから、アプリケーションの実行部のコードはいままでどおり .Net Framework クラスライブラリを使うことができます。つまり、WPF アプリケーションにしたからといってアプリケーションとしての性能まで落ちるということはありません。
私は本格的な WPF アプリケーションをいまだ見たことはありませんが、そのうち、センセーショナルなアプリケーションがでてくるでしょうから、そうなると一気にブレークするかもしれません。
−以上−