SilverlightアプリケーションのUIは、従来のWindowsフォームでは難しかった柔軟で制限のないデザインが可能となっています。Windowsフォームの標準コントロールでは、ボタンやリスト項目に表示できるコンテンツはテキストや簡単なアイコンだけであり、複雑なデザインを実現するにはプログラムを記述してコントロールの拡張を行なう必要がありました。しかし、Silverlighではコントロールのコンテンツに任意の図形や他のコントロール、画像、さらには動画を表示させてしまうことも(意味があるかどうかは別として)可能です。

さらに、標準コントロールも図形も統一して操作することができるため、アプリケーション全体の座標変換が容易です。コントロール全体の拡大や縮小、回転や傾斜を簡単に行えます。Silverlightの柔軟なデザイン性を証明する代表的なサンプルに、アニメーションで回転する標準コントロールのボタンなどを見かけます。実用的な例ではありませんが、コンテンツを混沌と組み合わせられるのは、SilverlightのUIデザインに制限が少ないことを証明しています。

図01 自由なリストボックスの項目

図01は、楕円形やボタンなどの標準コントロールをリストボックスの項目として表示した例です。これらは、リストボックス内の選択可能な項目として機能すると同時に、本来のコントロールとしての役割も果たします。描画可能なオブジェクトであれば、何でもリストボックスの項目として表示できます。

図02 回転・伸縮・傾斜したコントロール

図02は、標準コントロールに回転・伸縮・傾斜などの描画変換を加えた状態です。これらのデザインに特別なプログラムは不要であり、XAMLの記述やExpression Blendの操作だけで簡単に作成できるのです。もちろん、図02の各コントロールは本来の機能を失うことなく操作できます。例えば、変形しているボタンもクリックすることができ、アプリケーション側でClickイベントを感知できます。

こうした自由で柔軟性のあるデザインは、Silverlightによって描画されるあらゆる要素が「UIElement」という共通した抽象クラスから派生する一貫した設計によって実現されています。コントロール、図形、画像、動画、その他のあらゆる描画可能なオブジェクトは、必ずUIElementから派生しています。

System.Windows.UIElement クラス

public abstract class UIElement : DependencyObject
System.Object
  System.Windows.DependencyObject
    System.Windows.UIElement

抽象基底クラスであるUIElementで提供される機能は最低限のものですが、可視性、透明度、描画変換、クリップなどの状態を制御できます。ボタンやリストボックスなどの標準コントロールに表示するコンテンツの型にもUIElementが使われているため、コントロールと図形の組み合わせも自由に行えます。

Silverlightは、最終的に自身のアプリケーションを表すApplicationクラスのRootVisualプロパティに設定されているUIElementオブジェクトを画面に表示します。通常、このプロパティには子コントロールなどを含んでいるコンテナ(一般的にはGridクラスのオブジェクト)を設定することになります。

Application クラス RootVisual プロパティ

public UIElement RootVisual { get; set; }

よって、SilverlightにはGDIのような描画関数は存在しません。Silverlight上に描画される結果はRootVisualプロパティに設定されているUIElementをルートとするビジュアルツリーと呼ばれる木構造に従います。

次期バージョンのSilverlight 3からはビットマップの生成が可能になりますが、現バージョンであるSilverlight 2では、複数のジオメトリを表すオブジェクトを組み合わせて目的の図形を表示させます。ピクセルを直接制御することはできませんが、解像度に依存しないため劣化することなく高速に伸縮できます。

すべてのコンテンツがUIElementから派生しているという設計は、アプリケーション開発に多くのメリットをもたらします。コンテンツを木構造で統合管理しているので、複雑なデザインであっても、個別の要素の検索やアクセスが容易になります。対象が図形、画像、動画、コントロールなどの種類を問わずに同じコードで制御できるため、アニメーションなどの演出も一貫した処理が可能です。

このような柔軟なデザイン性は、ビジネスアプリケーションにおけるデータの可視化に大きく貢献するでしょう。しかし、詳細なピクセル単位のエフェクト処理や描画のタイミング制御が極めて重要になるゲーム開発を検討する場合、果たしてSilverlightは実用的な実行環境になりえるでしょうか。自動メモリ管理による予期せぬガベージコレクションの発生など、本来は便利な機能もゲームでは問題になることがあります。次回は、ゲーム実行環境としてのSilverlightを検証してみましょう。

著者プロフィール:赤坂玲音

フリーランスのテクニカルライタ兼アプリケーション開発者。主にクライアント技術、プレゼンテーション技術が専門。2005年から現在まで「Microsoft MVP Visual C++」受賞。技術解説書を中心に著書多数。近著に『Silverlight入門』(翔泳社)などがある。