リソースとコード

この概要では、Extensible Application Markup Language (XAML) 構文ではなくコードを使用して、Windows Presentation Foundation (WPF) リソースにアクセスまたは作成する方法に重点を置いて説明します。 一般的なリソースの使用法と XAML 構文の観点から見たリソースの詳細については、「XAML リソース」を参照してください。

コードからのリソースへのアクセス

リソースを識別するキーは、XAML で定義されていれば、コードでリソースを要求する際にも特定のリソースの取得に使用されます。 コードからリソースを取得する最も簡単な方法は、アプリケーションのフレームワーク レベルのオブジェクトから FindResource メソッドまたは TryFindResource メソッドを呼び出すことです。 これらのメソッドは、要求したキーが見つからなかった場合の動作に違いがあります。 FindResource では例外が発生しますが、TryFindResource では例外は発生せず、null が返されます。 それぞれのメソッドは、入力パラメーターとしてリソース キーを受け取り、緩く型指定されたオブジェクトを返します。 通常、リソース キーは文字列ですが、文字列以外を使用する場合もあります。詳細については、「キーとしてのオブジェクトの使用」のセクションを参照してください。 通常は、返されたオブジェクトを、リソースの要求時に設定するプロパティで必要な型にキャストします。 コードのリソース解決の検索ロジックは、動的リソース参照の XAML の場合と同じです。 リソースの検索は、呼び出し元の要素から開始され、論理ツリー内の連続する親要素へと続きます。 その後、必要に応じて、アプリケーション リソース、テーマ、システム リソースへと検索が続きます。 コードによるリソースの要求では、リソース ディクショナリが XAML で読み込まれた後に行われた実行時の変更と、リアルタイムのシステム リソースの変更が適切に考慮されます。

キーによってリソースを検索し、戻り値を使用してプロパティを設定する簡単なコード例を次に示します。これは Click イベント ハンドラーとして実装されます。

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

リソース参照を割り当てる別のメソッドとして、SetResourceReference もあります。 このメソッドは、リソースのキーと、リソース値を割り当てる要素インスタンスに存在する特定の依存関係プロパティの識別子の 2 つのパラメーターを受け取ります。 このメソッドは機能的には前のメソッドと同じですが、戻り値をキャストしなくて済むという利点があります。

他にも、プログラムによってリソースにアクセスする方法として、ディクショナリとしての Resources プロパティのコンテンツにアクセスする方法があります。 このプロパティによって格納されたディクショナリにアクセスする方法は、新しいリソースを既存のコレクションに追加する方法、指定したキー名がコレクション既に取得されたかどうかを確認する方法などのその他のディクショナリ/コレクション操作でもあります。 WPF アプリケーション全体をコードで記述する場合は、コレクション全体もコードで作成して、これにキーを割り当て、完了したコレクションを設定されている要素の Resources プロパティに割り当てることもできます。 これについては次のセクションで説明します。

特定のキーをインデックスとして使用して特定の Resources コレクション内にインデックスを作成できますが、この方法でリソースにアクセスした場合、リソース解決の通常の実行時のルールに従っていることにはならないことにご注意ください。 特定のコレクションにアクセスしているだけです。 要求したキーで有効なオブジェクトが見つからなかった場合、リソース検索がルートまたはアプリケーションに向かうスコープを走査することはありません。 ただし、この方法では、キーの検索スコープがより限定されるため、特定のケースでパフォーマンス上のメリットが生じる場合があります。 リソース ディクショナリを直接使用する方法の詳細については、ResourceDictionary クラスを参照してください。

コードによるリソースの作成

WPF アプリケーション全体をコードで作成する場合は、そのアプリケーションのリソースもコードで作成することができます。 これを実現するには、新しい ResourceDictionary インスタンスを作成し、ResourceDictionary.Add を連続して呼び出して、すべてのリソースをディクショナリに追加します。 次に、作成された ResourceDictionary を使用して、ページ スコープまたは Application.Resources 内にある要素の Resources プロパティを設定します。 ResourceDictionary は、要素に追加せずにスタンドアロン オブジェクトとして保持することもできます。 ただし、これを行う場合は、ジェネリック ディクショナリの場合と同様に、項目のキーによって内部のリソースにアクセスする必要があります。 要素の Resources プロパティに割り当てられていない ResourceDictionary は、要素ツリーの一部として存在することはなく、一連の検索で FindResource および関連メソッドによって使用できるスコープがありません。

キーとしてのオブジェクトの使用

通常、リソースを使用する場合、リソースのキーは文字列として設定されます。 ただし、WPF の各種機能の中にはキーを指定する際に意図的に文字列型を使用しないで、このパラメーターにオブジェクトを使用するものもあります。 オブジェクトによってリソースにキーを設定するには、WPF でのスタイルおよびテーマの適用のサポートを利用します。 スタイルが設定されていないコントロールの既定のスタイルとなるテーマのスタイルには、適用されるコントロールの Type によってそれぞれキーが設定されます。 型によってキーが設定されると、各コントロール型の既定のインスタンスで機能する信頼できる検索機構が実現され、型はリフレクションによって検索できるようになり、派生型に既定のスタイルが設定されていない場合でも派生クラスのスタイルを設定する際に使用できます。 XAML で定義されたリソースの Type キーは、x:Type マークアップ拡張を使用して指定できます。 ComponentResourceKey マークアップ拡張機能など、文字列以外のキーの使用で WPF 機能をサポートする同様の拡張機能があります。

関連項目