リソースとコード

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

このトピックは、次のセクションで構成されています。

  • コードからリソースにアクセスする
  • コードでリソースを作成する
  • オブジェクトをキーとして使用する
  • 関連トピック

コードからリソースにアクセスする

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

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

    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
void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}

リソース参照を割り当てる別のメソッドには、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 機能をサポートする同様の拡張機能があります。

参照

概念

リソースの概要

スタイルとテンプレート