次の方法で共有


リソースとコード

この概要では、拡張アプリケーション マークアップ言語 (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 つのパラメーターを受け取ります。 機能的には、このメソッドは同じであり、戻り値のキャストを必要としないという利点があります。

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

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

コードを使用したリソースの作成

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

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

ほとんどのリソース使用量では、リソースのキーが文字列に設定されます。 ただし、さまざまな WPF 機能では、キーを指定するために文字列型を意図的に使用しません。代わりに、このパラメーターはオブジェクトです。 オブジェクトによってリソースをキー設定する機能は、WPF スタイルとテーマのサポートによって使用されます。 スタイルが設定されていないコントロールの既定スタイルとなるテーマ内のスタイルは、それぞれが適用すべきコントロールの Type に基づいてキー設定されます。 型によってキーを設定すると、各コントロール型の既定のインスタンスで動作する信頼性の高い参照メカニズムが提供され、型はリフレクションによって検出され、派生型に既定のスタイルがない場合でも派生クラスのスタイル設定に使用できます。 xaml で定義されているリソースの Type キーは、x:Type Markup Extensionを使用して指定できます。 ComponentResourceKey Markup Extensionなど、WPF 機能をサポートする他の非文字列キー使用法にも同様の拡張機能が存在します。

関連項目