コード内のリソース (WPF .NET)

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

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

XAML で定義されたリソースを識別するキーは、コードでリソースを要求する場合に特定のリソースを取得するためにも使用します。 コードからリソースを取得する最も簡単な方法は、アプリケーションのフレームワーク レベルのオブジェクトから FindResource メソッドまたは TryFindResource メソッドを呼び出すことです。 これらのメソッドは、要求したキーが見つからなかった場合の動作に違いがあります。 FindResource では例外が発生します。 TryFindResource では例外は発生しませんが、null が返されます。 それぞれのメソッドは、入力パラメーターとしてリソース キーを受け取り、緩く型指定されたオブジェクトを返します。

通常、リソース キーは文字列ですが、文字列以外を使用する場合があります。 コードのリソース解決の検索ロジックは、動的リソース参照の XAML の場合と同じです。 リソースの検索は、呼び出し元の要素から始まり、論理ツリーの親要素を介して続きます。 その後、必要に応じて、アプリケーション リソース、テーマ、システム リソースへと検索が続きます。 リソースのコード要求では、実行時に発生したリソースへの変更が適切に考慮されます。

次のコード例は、キーでリソースを検索し、戻り値を使用してプロパティを設定する Click イベント ハンドラーを示しています。

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(Me.FindResource("RainbowBrush"), Brush)
End Sub

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

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

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

コードを使用してリソースを作成する

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

オブジェクトをキーとして使用する

通常、リソースを使用する場合、リソースのキーは文字列として設定されます。 しかしながら、さまざまな WPF 機能によって、オブジェクトの種類は、文字列ではなくキーとして意図的に使用されています。 オブジェクトの種類でリソースにキーを設定する機能は、WPF スタイルおよびテーマ適用のサポートで使用されています。 スタイルが設定されていないコントロールの既定になるスタイルとテーマは、適用すべきコントロールの Type によってそれぞれキーが設定されます。

種類によってキーが設定されると、各コントロールの種類の既定のインスタンスで動作する信頼性の高い検索メカニズムが提供されます。 種類はリフレクションによって検出され、派生の種類に既定のスタイルがない場合でも派生クラスのスタイルを設定するために使用することができます。 XAML で定義されたリソースの Type キーは、x:Type マークアップ拡張を使用して指定できます。 ComponentResourceKey マークアップ拡張機能など、文字列以外のキーの使用で WPF 機能をサポートする同様の拡張機能があります。

詳細については、「スタイル、DataTemplates、暗黙的なキー」を参照してください。

関連項目