前回は、WPF が登場した背景を見ました。
WPF は、コントロール、2D/3D グラフィックス、動画、ドキュメント、データバインディングなどを統一的に扱うためのフレームワークです。では、その WPF はどのようなアセンブリや名前空間によって構成されているのでしょうか。
この記事では、WPF を理解するうえで最初に押さえておきたい 主要アセンブリ と 代表的な名前空間 を整理します。
アセンブリと名前空間の違い
最初に、アセンブリと名前空間の違いを確認しておきます。
アセンブリ は、コンパイルされた .dll や .exe の単位です。WPF の機能は複数の DLL に分かれて提供されています。
一方、名前空間 は、クラスを分類するための論理的な名前です。たとえば Button クラスは System.Windows.Controls 名前空間に属します。
using System.Windows;
using System.Windows.Controls;
Window window = new Window();
Button button = new Button();
つまり、アセンブリは「どの DLL に入っているか」、名前空間は「どの分類名で参照するか」を表します。
コア WPF アセンブリ
WPF の中心となるアセンブリには、次のようなものがあります。
| アセンブリ | 役割 |
|---|---|
PresentationCore.dll |
描画、メディア、入力、ビジュアル層など、WPF の低レベルな表示基盤を提供する |
PresentationFramework.dll |
Window、Button、TextBox など、アプリケーション開発で直接使う高レベルな UI 部品を提供する |
System.Xaml.dll |
XAML の読み込み、解析、オブジェクト生成に関する基盤を提供する |
WindowsBase.dll |
依存関係プロパティ、Dispatcher、Freezable など、WPF の土台となる共通機能を提供する |
以降で、それぞれの意味を簡潔に見ていきます。
PresentationCore
PresentationCore.dll は、WPF の描画やメディア処理を支える中核的なアセンブリです。
ここには、ビジュアルツリー、入力処理、2D/3D 描画、画像、ブラシ、ジオメトリ、アニメーション、メディア再生などに関わる型が含まれます。
たとえば、次のような名前空間や型は PresentationCore.dll と深く関係します。
System.Windows.MediaSystem.Windows.Media.AnimationSystem.Windows.Media.ImagingSystem.Windows.Media.Media3DVisualDrawingContextBrushGeometry
WPF では、画面上の要素は最終的に描画可能なビジュアルとして扱われます。PresentationCore.dll は、その「画面に表示する」という処理の基礎を担当するアセンブリです。
言い換えると、PresentationCore.dll は WPF の表示エンジン寄りの部分です。アプリケーション開発者が直接意識する機会は PresentationFramework.dll より少ないですが、WPF のリッチな描画表現を支える重要な層です。
PresentationFramework
PresentationFramework.dll は、WPF アプリケーションを作るときに最もよく使うアセンブリです。
ここには、ウィンドウ、ページ、ボタン、テキストボックス、リスト、メニュー、レイアウトパネルなど、アプリケーションの画面を構成する高レベルな部品が含まれます。
代表的な型には、次のようなものがあります。
ApplicationWindowPageButtonTextBoxListBoxGridStackPanelStyleControlTemplateDataTemplate
WPF で通常の画面を作る場合、もっとも多く触れるのはこの層です。
たとえば、次の XAML に登場する Window、Grid、Button は、いずれも PresentationFramework.dll に含まれる高レベルな UI 要素です。
<Window x:Class="SampleApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Sample" Width="300" Height="200">
<Grid>
<Button Content="OK" Width="100" Height="32" />
</Grid>
</Window>
PresentationFramework.dll は、WPF を「アプリケーションフレームワーク」として使うための中心です。
System.Xaml.dll
System.Xaml.dll は、XAML を扱うための基盤を提供するアセンブリです。
XAML は、XML 形式でオブジェクトの生成やプロパティ設定を表現するための言語です。WPF では、画面の構造を XAML で定義し、それを実行時またはビルド時に .NET オブジェクトとして扱います。
たとえば、次の XAML は Button オブジェクトを生成し、Content、Width、Height プロパティを設定する記述です。
<Button Content="保存" Width="100" Height="32" />
このような XAML を読み取り、対応するオブジェクトを生成するための仕組みが XAML インフラストラクチャです。
System.Xaml.dll は、WPF 専用というより、XAML というマークアップ言語そのものを扱うための基盤に近い位置づけです。XAML リーダー、XAML ライター、XAML 型システムなどに関わる型を提供します。
WPF アプリケーションを書いていると、System.Xaml.dll の型を直接使う場面は多くありません。しかし、XAML が C# のオブジェクトとして読み込まれる裏側では、このような仕組みが働いています。
WindowsBase.dll
WindowsBase.dll は、WPF の土台となる共通機能を提供するアセンブリです。
特に重要なのが、次のような仕組みです。
- 依存関係プロパティ
- Dispatcher
- スレッドモデル
- Freezable
- 基本的な構造体や補助クラス
WPF では、通常の .NET プロパティとは別に 依存関係プロパティ という仕組みが使われます。
public static readonly DependencyProperty TitleProperty;
依存関係プロパティは、データバインディング、スタイル、アニメーション、既定値、継承値などを支える非常に重要な仕組みです。この基盤は WindowsBase.dll に含まれます。
また、WPF の UI は基本的に UI スレッド上で操作します。その UI スレッドに処理を戻すための Dispatcher も、WPF アプリケーションでは重要です。
Dispatcher.Invoke(() =>
{
// UI スレッドで実行する処理
});
WindowsBase.dll は見た目のコントロールを提供するアセンブリではありません。しかし、WPF のプロパティシステム、オブジェクトモデル、スレッド処理を支える基礎部分として欠かせない存在です。
コア WPF 名前空間
次に、WPF でよく使う名前空間を整理します。
| 名前空間 | 役割 |
|---|---|
System.Windows |
WPF 全体の基本型を提供する |
System.Windows.Controls |
ボタン、テキストボックス、レイアウトパネルなどのコントロールを提供する |
System.Windows.Data |
データバインディングに関する型を提供する |
System.Windows.Documents |
フロードキュメントや固定ドキュメントに関する型を提供する |
System.Windows.Ink |
手書き入力やインク描画に関する型を提供する |
System.Windows.Markup |
XAML の読み込みやマークアップ拡張に関する型を提供する |
System.Windows.Media |
ブラシ、色、図形描画、画像、変形などのメディア関連型を提供する |
System.Windows.Navigation |
ページ遷移やナビゲーションアプリケーションに関する型を提供する |
System.Windows.Shapes |
Rectangle、Ellipse、Line などの図形要素を提供する |
System.Windows
System.Windows は、WPF の基本的な型が集まる名前空間です。
代表的な型には、次のようなものがあります。
ApplicationWindowDependencyObjectDependencyPropertyRoutedEventArgsThicknessPointSizeRect
WPF アプリケーション全体を表す Application、ウィンドウを表す Window、依存関係プロパティの基礎となる DependencyObject など、WPF の根幹に関わる型が含まれます。
System.Windows は、WPF の「基本語彙」が入っている名前空間だと考えると分かりやすいです。
System.Windows.Controls
System.Windows.Controls は、WPF のコントロールが集まる名前空間です。
ボタン、テキストボックス、チェックボックス、リスト、メニュー、タブなど、ユーザーが直接操作する UI 部品の多くがここに含まれます。
ButtonTextBoxCheckBoxComboBoxListBoxDataGridMenuTabControl
また、レイアウトを担当するパネルもこの名前空間に含まれます。
GridStackPanelDockPanelWrapPanelCanvas
WPF で画面を作るときに、最もよく使う名前空間のひとつです。
System.Windows.Data
System.Windows.Data は、データバインディングに関する名前空間です。
WPF の大きな特徴のひとつは、UI とデータをバインディングで接続できることです。
<TextBox Text="{Binding UserName}" />
このようなバインディングを支える型が System.Windows.Data に含まれます。
代表的な型には、次のようなものがあります。
BindingBindingExpressionMultiBindingPriorityBindingCollectionViewIValueConverter
特に Binding と IValueConverter は、WPF アプリケーションでよく使います。
System.Windows.Data は、画面とデータを手作業で同期するコードを減らすための名前空間です。
System.Windows.Documents
System.Windows.Documents は、ドキュメント表示に関する名前空間です。
WPF には、単なるテキスト表示だけでなく、段落、見出し、リスト、表、画像などを含む文書を扱うための仕組みがあります。
代表的な型には、次のようなものがあります。
FlowDocumentFixedDocumentParagraphRunSpanTableBlockInline
FlowDocument は、表示領域に応じてテキストが流し込まれる文書を表します。ウィンドウサイズや表示幅が変わると、行の折り返しや配置が調整されます。
一方、FixedDocument は、印刷物のようにページ単位で固定されたレイアウトを扱うための型です。
System.Windows.Documents は、WPF のドキュメント機能を担当する名前空間です。
System.Windows.Ink
System.Windows.Ink は、ペン入力や手書き入力に関する名前空間です。
タブレット PC、スタイラス、タッチ入力などで描かれた手書きの線を扱うための型が含まれます。
代表的な型には、次のようなものがあります。
StrokeStrokeCollectionDrawingAttributesStylusPointStylusPointCollection
WPF には InkCanvas というコントロールがあり、手書き入力を比較的簡単に扱えます。
<InkCanvas Background="White" />
InkCanvas 自体は System.Windows.Controls に属しますが、そこで描かれた線やペンの属性を表す型は System.Windows.Ink に含まれます。
System.Windows.Ink は、手書きメモ、署名、図形の手描き入力などを扱うための名前空間です。
System.Windows.Markup
System.Windows.Markup は、XAML の読み込みやマークアップ拡張に関する名前空間です。
WPF の XAML では、通常のプロパティ設定だけでなく、特殊な構文を使うことがあります。
<TextBox Text="{Binding UserName}" />
この {Binding ...} のような構文は、マークアップ拡張と呼ばれます。
代表的な型には、次のようなものがあります。
MarkupExtensionXamlReaderXamlWriterContentPropertyAttributeXmlnsDefinitionAttribute
通常の WPF アプリケーションでは、System.Windows.Markup を直接使う機会は多くありません。しかし、独自のマークアップ拡張を作る場合や、XAML を動的に読み込む場合には重要になります。
System.Windows.Markup は、XAML を .NET オブジェクトとして扱うための橋渡しをする名前空間です。
System.Windows.Media
System.Windows.Media は、描画やメディア表現に関する名前空間です。
色、ブラシ、ペン、ジオメトリ、変形、画像、アニメーションなど、WPF の見た目を支える多くの型がここに含まれます。
代表的な型には、次のようなものがあります。
BrushSolidColorBrushLinearGradientBrushColorPenGeometryTransformImageSourceVisual
たとえば、ボタンの背景色にブラシを設定する場合も、この名前空間の型が使われます。
<Button Content="OK" Background="LightBlue" />
XAML では文字列で簡単に書けますが、内部的には Brush や Color などの型として扱われます。
System.Windows.Media は、WPF のリッチな描画表現を支える名前空間です。
System.Windows.Navigation
System.Windows.Navigation は、ページ遷移やナビゲーションに関する名前空間です。
WPF では、通常のウィンドウアプリケーションだけでなく、ページを切り替えながら表示するナビゲーション型のアプリケーションも作れます。
代表的な型には、次のようなものがあります。
NavigationWindowNavigationServiceNavigatingCancelEventArgsNavigationEventArgsJournalEntry
Page と NavigationWindow を使うと、Web ブラウザーのように前へ戻る、次へ進むといった操作を持つアプリケーションを作れます。
<NavigationWindow Source="HomePage.xaml" />
System.Windows.Navigation は、画面をページとして扱い、履歴付きで遷移させるための名前空間です。
System.Windows.Shapes
System.Windows.Shapes は、WPF の図形要素を提供する名前空間です。
代表的な型には、次のようなものがあります。
LineRectangleEllipsePolygonPolylinePath
これらは単なる描画命令ではなく、WPF の要素として画面上に配置できます。
<Canvas>
<Ellipse Width="120"
Height="80"
Fill="LightBlue"
Stroke="Navy"
Canvas.Left="20"
Canvas.Top="20" />
</Canvas>
Ellipse や Rectangle は、他のコントロールと同じようにレイアウトの中に置けます。プロパティを変更したり、スタイルを適用したり、アニメーションさせたりすることもできます。
System.Windows.Shapes は、WPF のベクター図形を UI 要素として扱うための名前空間です。
まとめ
WPF は、複数のアセンブリと名前空間によって構成されています。
アセンブリで見ると、PresentationCore.dll は描画やメディアなどの低レベルな表示基盤、PresentationFramework.dll はアプリケーション開発で直接使う UI 部品、System.Xaml.dll は XAML の基盤、WindowsBase.dll は依存関係プロパティや Dispatcher などの土台を担当します。
名前空間で見ると、System.Windows は基本型、System.Windows.Controls はコントロール、System.Windows.Data はデータバインディング、System.Windows.Media は描画表現というように、役割ごとに分類されています。
最初からすべてを暗記する必要はありません。WPF のコードや XAML を読むときに、「この型はどの領域の機能なのか」を大まかに把握できれば十分です。
次回以降は、実際に XAML を使って WPF の画面構造を作りながら、これらの名前空間がどのように登場するかを見ていきます。