ここでは、リソースについて説明します。WPFのコントロールには、ResourceDicinonary型のResourcesというプロパティが定義されています。ResourceDicinonaryクラスの中には、画像・文字列・オブジェクトなど様々なものを名前をつけて保持することが出来ます。そして、保持しているリソースにはXAMLやプログラムから参照して使うことが出来ます。
リソースの定義
リソースの定義は、通常WindowやAppクラスのResourcesプロパティに定義します。以下にApp.xamlにブラシのリソースを2つ定義する例を示します。
<Application x:Class="ResourceSample01.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"StartupUri="MainWindow.xaml"><Application.Resources><ImageBrush x:Key="AnthemBrush"ImageSource="anthem.jpg" /><SolidColorBrush x:Key="RedBrush"Color="Red" /></Application.Resources></Application>
リソースは、x:Key属性で名前をつけて定義します。このx:Keyで指定した値を元にXAMLやプログラム内からリソースにアクセスします。
App.xamlにリソースを定義すると、全てのWindowから共通で使用できるというメリットがあります。共通で使用するリソースはApp.xamlで定義をして、Window固有のリソースはWindowで定義して利用するのが一般的です。例外的な使い方として、各コントロールのResourcesプロパティにリソースを定義する方法もありますが、この場合、そのコントロール内でしか利用できないリソースとなります。
リソースの参照方法
リソースを参照する方法は、大きくわけて3つあります。StaticResourceマークアップ拡張を使う方法、DynamicResourceマークアップ拡張を使う方法、プログラムからアクセスする方法です。
StaticResourceマークアップ拡張は、実質的にはリソースの値を代入するのと等価です。DynamicResourceマークアップ拡張は、設定したキーのリソースが変更されるかどうかを実行時に監視していて、リソースが変わったタイミングで再代入が行われます。以下のように、BorderのBackgroundプロパティにAnthemBrushをStaticResourceマークアップ拡張とDynamicResourceマークアップ拡張で設定します。
<Border x:Name="border"Width="100"Height="100"Background="{StaticResource AnthemBrush}" /><Border Width="100"Height="100"Background="{DynamicResource AnthemBrush}" />
この状態で、以下のようにAnthemBrushを置き換えるコードを記述します。
App.Current.Resources["AnthemBrush"] = new SolidColorBrush(Colors.Blue);
この状態で、プログラムを実行すると、以下のような結果になります。
DynamicResourceマークアップ拡張を使用したほうが実行時に動的にリソースの変更に対応できていることが確認できます。DyanmicResourceマークアップ拡張を使うと、例えばアプリケーションのテーマの切り替えといったことが可能になります。しかし、必要でない限りStaticResourceマークアップ拡張を使うべきです。その理由は、単純にStaticResourceマークアップ拡張のほうがDynamicResourceマークアップ拡張よりもパフォーマンスが良いからです。
StaticResourceマークアップ拡張を使う時の注意点として、単純な代入という特徴から、使用するよりも前でリソースが定義されてないといけないという特徴があります。DynamicResourceマークアップ拡張は、このような制約が無いため、どうしても前方でリソースの宣言が出来ないときもDynamicResourceマークアップ拡張を使う理由になります。
マークアップ拡張を使う以外にコードからリソースを参照する方法を示します。
var brush = (SolidColorBrush)this.FindResource("RedBrush"); this.border.Background = brush;
FindResourceメソッドを使うことで、起点となるインスタンス(Windowなど)からAppクラスまで親へ親へリソースを探して最初にみつかったものを返します。見つからない場合は例外を返します。存在するかどうかがわからないリソースを参照する場合はTryFindResourceメソッドを使ってください。
過去記事
- WPF4.5入門 その1 「はじめに」
- WPF4.5入門 その2 「WPFとは」
- WPF4.5入門 その3 「Hello world」
- WPF4.5入門 その4 「Mainメソッドはどこにいった?」
- WPF4.5入門 その5 「全てC#でHello world」
- WPF4.5入門 その6 「WPFを構成するものを考えてみる」
- WPF4.5入門 その7 「XAMLのオブジェクト要素と名前空間」
- WPF4.5入門 その8 「オブジェクト要素のプロパティ」
- WPF4.5入門 その9 「コレクション構文」
- WPF4.5入門 その10 「コンテンツ構文」
- WPF4.5入門 その11 「マークアップ拡張」
- WPF4.5入門 その12 「その他のXAMLの機能」
- WPF4.5入門 その13 「簡単なレイアウトを行うコントロール」
- WPF4.5入門 その14 「レイアウトコントロールのCanvasとStackPanel」
- WPF4.5入門 その15 「レイアウトコントロールのDockPanelとWrapPanel」
- WPF4.5入門 その16 「ViewBoxコントロール」
- WPF4.5入門 その17 「ScrollViewerコントロール」
- WPF4.5入門 その18 「Gridコントロール part 1」
- WPF4.5入門 その19 「Gridコントロール part 2」
- WPF4.5入門 その20 「レイアウトに影響を与えるプロパティ」
- WPF4.5入門 その21 「WPFのコンセプトと重要な機能つまみ食い」
- WPF4.5入門 その22 「Buttonコントロール」
- WPF4.5入門 その23 「DataGridコントロール その1」
- WPF4.5入門 その24 「DataGridコントロール その2」
- WPF4.5入門 その25 「TreeViewコントロール その1」
- WPF4.5入門 その26 「TreeViewコントロール その2」
- WPF4.5入門 その28 「Calendarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その29 「ContextMenuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その30「Menuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その31 「ToolBarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その32 「CheckBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その33 「ComboBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その34 「ListBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その35 「RadioButtonコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その36 「Sliderコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その37 「TabControl」 - かずきのBlog@hatena
- WPF4.5入門 その38 「ファイルダイアログ」 - かずきのBlog@hatena
- WPF4.5入門 その39 「情報を表示するコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その40 「Popup、ToolTip、TextBox、Image、MediaElementコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その41 「DispatcherObject」 - かずきのBlog@hatena
- WPF4.5入門 その42 「WPFのプロパティシステム」 - かずきのBlog@hatena
- WPF4.5入門 その43 「読み取り専用の依存関係プロパティ」 - かずきのBlog@hatena
- 拡張されたプロパティメタデータ - かずきのBlog@hatena
- WPF4.5入門 その45 「添付プロパティ」 - かずきのBlog@hatena
- WPF4.5入門 その46 「WPFのイベントシステム」 - かずきのBlog@hatena
- WPF4.5入門 その47 「コンテンツモデル」 - かずきのBlog@hatena
- WPF4.5入門 その48 「WPFのアニメーション その1」 - かずきのBlog@hatena
- WPF4.5入門 その49 「WPFのアニメーション その2」 - かずきのBlog@hatena
- WPF4.5入門 その50 「Style」 - かずきのBlog@hatena