リソースとコードResources and Code

この概要では、Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) 構文ではなく、コードを使用して Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) リソースにアクセスする方法、またはこのリソースを作成する方法に重点を置いて説明します。This overview concentrates on how Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) resources can be accessed or created using code rather than Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) syntax. 一般的なリソースの使用法と XAMLXAML 構文の観点から見たリソースの詳細については、「XAML リソース」を参照してください。For more information on general resource usage and resources from a XAMLXAML syntax perspective, see XAML Resources.

コードからのリソースへのアクセスAccessing Resources from Code

リソースを識別するキーは、XAMLXAML で定義されていれば、コードでリソースを要求する際にも特定のリソースの取得に使用されます。The keys that identify resources if they are defined through XAMLXAML are also used to retrieve specific resources if you request the resource in code. コードからリソースを取得する最も簡単な方法は、アプリケーションでフレームワークレベルのオブジェクトから FindResource または TryFindResource メソッドを呼び出すことです。The simplest way to retrieve a resource from code is to call either the FindResource or the TryFindResource method from framework-level objects in your application. これらのメソッドは、要求したキーが見つからなかった場合の動作に違いがあります。The behavioral difference between these methods is what happens if the requested key is not found. FindResource は例外を発生させます。TryFindResource は例外を発生させませんが、nullを返します。FindResource raises an exception; TryFindResource will not raise an exception but returns null. それぞれのメソッドは、入力パラメーターとしてリソース キーを受け取り、緩く型指定されたオブジェクトを返します。Each method takes the resource key as an input parameter, and returns a loosely typed object. 通常、リソース キーは文字列ですが、文字列以外を使用する場合もあります。詳細については、「キーとしてのオブジェクトの使用」のセクションを参照してください。Typically, a resource key is a string, but there are occasional nonstring usages; see the Using Objects as Keys section for details. 通常は、返されたオブジェクトを、リソースの要求時に設定するプロパティで必要な型にキャストします。Typically you would cast the returned object to the type required by the property that you are setting when requesting the resource. コードのリソース解決の検索ロジックは、動的リソース参照の XAMLXAML の場合と同じです。The lookup logic for code resource resolution is the same as the dynamic resource reference XAMLXAML case. リソースの検索は、呼び出し元の要素から開始され、論理ツリー内の連続する親要素へと続きます。The search for resources starts from the calling element, then continues to successive parent elements in the logical tree. その後、必要に応じて、アプリケーション リソース、テーマ、システム リソースへと検索が続きます。The lookup continues onwards into application resources, themes, and system resources if necessary. コードによるリソースの要求では、リソース ディクショナリが XAMLXAML で読み込まれた後に行われた実行時の変更と、リアルタイムのシステム リソースの変更が適切に考慮されます。A code request for a resource will properly account for runtime changes in resource dictionaries that might have been made subsequent to that resource dictionary being loaded from XAMLXAML, and also for realtime system resource changes.

キーによってリソースを検索し、戻り値を使用してプロパティを設定し、Click イベントハンドラーとして実装する簡単なコード例を次に示します。The following is a brief code example that finds a resource by key and uses the returned value to set a property, implemented as a Click event handler.

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ます。An alternative method for assigning a resource reference is SetResourceReference. このメソッドは、リソースのキーと、リソース値を割り当てる要素インスタンスに存在する特定の依存関係プロパティの識別子の 2 つのパラメーターを受け取ります。This method takes two parameters: the key of the resource, and the identifier for a particular dependency property that is present on the element instance to which the resource value should be assigned. このメソッドは機能的には前のメソッドと同じですが、戻り値をキャストしなくて済むという利点があります。Functionally, this method is the same and has the advantage of not requiring any casting of return values.

プログラムによってリソースにアクセスするもう1つの方法として、Resources プロパティの内容に辞書としてアクセスする方法もあります。Still another way to access resources programmatically is to access the contents of the Resources property as a dictionary. このプロパティによって格納されたディクショナリにアクセスする方法は、新しいリソースを既存のコレクションに追加する方法、指定したキー名がコレクション既に取得されたかどうかを確認する方法などのその他のディクショナリ/コレクション操作でもあります。Accessing the dictionary contained by this property is also how you can add new resources to existing collections, check to see if a given key name is already taken in the collection, and other dictionary/collection operations. WPFWPF アプリケーションを完全にコード内で記述する場合は、コードでコレクション全体を作成し、キーを割り当てて、完成したコレクションを確立された要素の Resources プロパティに割り当てることもできます。If you are writing a WPFWPF application entirely in code, you can also create the entire collection in code, assign keys to it, and then assign the finished collection to the Resources property of an established element. これについては次のセクションで説明します。This will be described in the next section.

インデックスとして特定のキーを使用して、特定の Resources コレクション内でインデックスを作成できますが、この方法でリソースにアクセスしても、リソース解決の通常のランタイムルールには従っていないことに注意してください。You can index within any given Resources collection, using a specific key as the index, but you should be aware that accessing the resource in this way does not follow the normal runtime rules of resource resolution. 特定のコレクションにアクセスしているだけです。You are only accessing that particular collection. 要求したキーで有効なオブジェクトが見つからなかった場合、リソース検索がルートまたはアプリケーションに向かうスコープを走査することはありません。Resource lookup will not be traversing the scope to the root or the application if no valid object was found at the requested key. ただし、この方法では、キーの検索スコープがより限定されるため、特定のケースでパフォーマンス上のメリットが生じる場合があります。However, this approach may have performance advantages in some cases precisely because the scope of the search for the key is more constrained. リソースディクショナリを直接操作する方法の詳細については、ResourceDictionary クラスを参照してください。See the ResourceDictionary class for more details on how to work with the resource dictionary directly.

コードによるリソースの作成Creating Resources with Code

WPFWPF アプリケーション全体をコードで作成する場合は、そのアプリケーションのリソースもコードで作成する必要があります。If you want to create an entire WPFWPF application in code, you might also want to create any resources in that application in code. これを実現するには、新しい ResourceDictionary インスタンスを作成し、ResourceDictionary.Addへの連続した呼び出しを使用して、すべてのリソースをディクショナリに追加します。To achieve this, create a new ResourceDictionary instance, and then add all the resources to the dictionary using successive calls to ResourceDictionary.Add. 次に、ページスコープまたは Application.Resourcesに存在する要素の Resources プロパティを設定するために作成された ResourceDictionary を使用します。Then, use the ResourceDictionary thus created to set the Resources property on an element that is present in a page scope, or the Application.Resources. また、ResourceDictionary を要素に追加せずに、スタンドアロンオブジェクトとして保持することもできます。You could also maintain the ResourceDictionary as a standalone object without adding it to an element. ただし、これを行う場合は、ジェネリック ディクショナリの場合と同様に、項目のキーによって内部のリソースにアクセスする必要があります。However, if you do this, you must access the resources within it by item key, as if it were a generic dictionary. 要素 Resources プロパティに関連付けられていない ResourceDictionary は、要素ツリーの一部として存在しないため、FindResource および関連するメソッドで使用できる参照シーケンスにスコープがありません。A ResourceDictionary that is not attached to an element Resources property would not exist as part of the element tree and has no scope in a lookup sequence that can be used by FindResource and related methods.

キーとしてのオブジェクトの使用Using Objects as Keys

通常、リソースを使用する場合、リソースのキーは文字列として設定されます。Most resource usages will set the key of the resource to be a string. ただし、WPFWPF の各種機能の中にはキーを指定する際に意図的に文字列型を使用しないで、このパラメーターにオブジェクトを使用するものもあります。However, various WPFWPF features deliberately do not use a string type to specify keys, instead this parameter is an object. オブジェクトによってリソースにキーを設定するには、WPFWPF でのスタイルおよびテーマの適用のサポートを利用します。The capability of having the resource be keyed by an object is used by the WPFWPF style and theming support. スタイルが設定されていないコントロールの既定のスタイルになるテーマのスタイルは、それぞれ、適用するコントロールの Type によってキー指定されます。The styles in themes which become the default style for an otherwise non-styled control are each keyed by the Type of the control that they should apply to. 型によってキーが設定されると、各コントロール型の既定のインスタンスで機能する信頼できる検索機構が実現され、型はリフレクションによって検索できるようになり、派生型に既定のスタイルが設定されていない場合でも派生クラスのスタイルを設定する際に使用できます。Being keyed by type provides a reliable lookup mechanism that works on default instances of each control type, and type can be detected by reflection and used for styling derived classes even though the derived type otherwise has no default style. X:Type マークアップ拡張機能を使用して、XAMLXAML で定義されているリソースの Type キーを指定できます。You can specify a Type key for a resource defined in XAMLXAML by using the x:Type Markup Extension. ComponentResourceKey マークアップ拡張機能など、文字列以外のキーの使用で WPFWPF 機能をサポートする同様の拡張機能があります。Similar extensions exist for other nonstring key usages that support WPFWPF features, such as ComponentResourceKey Markup Extension.

関連項目See also