{StaticResource} マークアップ拡張{StaticResource} markup extension

定義済みリソースへの参照を評価することで、任意の XAML 属性の値を提供します。Provides a value for any XAML attribute by evaluating a reference to an already defined resource. リソースは ResourceDictionary で定義されており、StaticResource の使用では ResourceDictionary 内のそのリソースのキーを参照します。Resources are defined in a ResourceDictionary, and a StaticResource usage references the key of that resource in the ResourceDictionary.

XAML 属性の使用方法XAML attribute usage

<object property="{StaticResource key}" .../>

XAML 値XAML values

期間Term 説明Description
keykey 要求されたリソースのキー。The key for the requested resource. このキーは、ResourceDictionary によって最初に割当てられます。This key is initially assigned by the ResourceDictionary. リソース キーとしては、XamlName の文法で定義されている任意の文字列を使うことができます。A resource key can be any string defined in the XamlName Grammar.

注釈Remarks

StaticResource は、XAML リソース ディクショナリ内の別の場所で定義されている XAML 属性の値を取得するための手法です。StaticResource is a technique for obtaining values for a XAML attribute that are defined elsewhere in a XAML resource dictionary. 値がリソース ディクショナリに格納される理由としては、複数のプロパティ値で共有されることや、XAML リソース ディクショナリが XAML パッケージングまたはファクタリング手法として使われることが挙げられます。Values might be placed in a resource dictionary because they are intended to be shared by multiple property values, or because a XAML resource dictionary is used as a XAML packaging or factoring technique. XAML パッケージング手法の例は、コントロールのテーマ ディクショナリです。An example of a XAML packaging technique is the theme dictionary for a control. もう 1 つの例は、リソースのフォールバックに使われるマージされたリソース ディクショナリです。Another example is merged resource dictionaries used for resource fallback.

StaticResource は、要求されたリソースについてキーを指定する 1 個の引数を受け取ります。StaticResource takes one argument, which specifies the key for the requested resource. リソース キーは常に、Windows ランタイム XAML の文字列です。A resource key is always a string in Windows Runtime XAML. リソース キーを最初に指定する方法について詳しくは、「x:Key 属性」をご覧ください。For more info on how the resource key is initially specified, see x:Key attribute.

StaticResource がリソース ディクショナリの項目に解決される規則は、このトピックでは説明していません。The rules by which a StaticResource resolves to an item in a resource dictionary are not described in this topic. そのような規則は、参照とリソースがいずれもテンプレートに存在するかどうかや、マージされたリソース ディクショナリを使うかどうかなどによって異なります。That depends on whether the reference and the resource both exist in a template, whether merged resource dictionaries are used, and so on. リソースの定義方法と ResourceDictionary の適切な使用方法 (サンプル コードを含む) について詳しくは、「ResourceDictionary と XAML リソースの参照」をご覧ください。For more info on how to define resources and properly use a ResourceDictionary, including sample code, see ResourceDictionary and XAML resource references.

重要   StaticResourceは、XAML ファイル内でさらに構文的に定義されているリソースへの前方参照を試行することはできません。Important   A StaticResource must not attempt to make a forward reference to a resource that is defined lexically further within the XAML file. そのようなことを試みることはサポートしていません。Attempting to do so is not supported. 前方参照が失敗しなかったとしても、そのようなことを試みるだけでパフォーマンスの低下を招きます。Even if the forward reference doesn't fail, trying to make one carries a performance penalty. 最善の結果を得るには、前方参照を避けるようにリソース ディクショナリの構成を調整します。For best results, adjust the composition of your resource dictionaries so that forward references are avoided.

解決できないキーに StaticResource を指定しようとすると、実行時に XAML の解析で例外が発生します。Attempting to specify a StaticResource to a key that cannot resolve throws a XAML parse exception at run time. デザイン ツールでも、警告やエラーが通知されることがあります。Design tools may also offer warnings or errors.

Windows ランタイム XAML プロセッサの実装では、StaticResource 機能のバッキング クラス表現はありません。In the Windows Runtime XAML processor implementation, there is no backing class representation for StaticResource functionality. StaticResource は、XAML マークアップでのみ使用できます。StaticResource is exclusively for use in XAML. コードで最も近いのは、Contains または TryGetValue を呼び出すなど、ResourceDictionary のコレクション API を使うことです。The closest equivalent in code is to use the collection API of a ResourceDictionary, for example calling Contains or TryGetValue.

{ThemeResource} マークアップ拡張は、別の場所の名前付きリソースを参照する同様のマークアップ拡張です。{ThemeResource} markup extension is a similar markup extension that references named resources in another location. 違いは、{ThemeResource} マークアップ拡張ではアクティブなシステム テーマに応じて異なるリソースを返すことができるという点です。The difference is that {ThemeResource} markup extension has the ability to return different resources depending on the system theme that's active. 詳しくは、「{ThemeResource} マークアップ拡張」をご覧ください。For more info see {ThemeResource} markup extension.

StaticResource は、マークアップ拡張です。StaticResource is a markup extension. 一般にマークアップ拡張機能を実装するのは、属性値をリテラル値やハンドラー名以外にエスケープする要件が存在し、その要件の適用範囲がグローバルで、特定の型やプロパティに型コンバーターを適用するだけにとどまらない場合です。Markup extensions are typically implemented when there is a requirement to escape attribute values to be other than literal values or handler names, and the requirement is more global than just putting type converters on certain types or properties. XAML のすべてのマークアップ拡張 { は、属性構文で "" と "" の文字を使用します } 。これは、マークアップ拡張機能が属性を処理する必要があることを xaml プロセッサが認識する規則です。All markup extensions in XAML use the "{" and "}" characters in their attribute syntax, which is the convention by which a XAML processor recognizes that a markup extension must process the attribute.

{StaticResource} の使用例An example {StaticResource} usage

この XAML 例は、XAML データ バインディング サンプルに関するページから抜粋したものです。This example XAML is taken from the XAML data binding sample.

<StackPanel Margin="5">
    <!-- Add converter as a resource to reference it from a Binding. --> 
    <StackPanel.Resources>
        <local:S2Formatter x:Key="GradeConverter"/>
    </StackPanel.Resources>
    <TextBlock Style="{StaticResource BasicTextStyle}" Text="Percent grade:" Margin="5" />
    <Slider x:Name="sliderValueConverter" Minimum="1" Maximum="100" Value="70" Margin="5"/>
    <TextBlock Style="{StaticResource BasicTextStyle}" Text="Letter grade:" Margin="5"/>
    <TextBox x:Name="tbValueConverterDataBound"
      Text="{Binding ElementName=sliderValueConverter, Path=Value, Mode=OneWay,  
        Converter={StaticResource GradeConverter}}" Margin="5" Width="150"/> 
</StackPanel> 

この例では、カスタム クラスによってサポートされるオブジェクトを、ResourceDictionary のリソースとして作成しています。This particular example creates an object that's backed by a custom class, and creates it as a resource in a ResourceDictionary. 有効なリソースにするには、ほかにも、この local:S2Formatter 要素に x:Key 属性値が必要です。To be a valid resource, this local:S2Formatter element must also have an x:Key attribute value. 属性値は "GradeConverter" に設定されます。The value of the attribute is set to "GradeConverter".

XAML でもう少し先に進むと、リソースが要求されています。{StaticResource GradeConverter} というところです。The resource is then requested just a bit further into the XAML, where you see {StaticResource GradeConverter}.

{StaticResource} マークアップ拡張を使って、別のマークアップ拡張 {Binding} マークアップ拡張のプロパティを設定していることに注意してください。つまり、ここではマークアップ拡張が 2 つ、入れ子構造で使われています。Note how the {StaticResource} markup extension usage is setting a property of another markup extension {Binding} markup extension, so there's two nested markup extension usages here. 内側のものが最初に評価されます。このため、リソースが取得された後、値として使われます。The inner one is evaluated first, so that the resource is obtained first and can be used as a value. これと同じ例は、「{Binding} マークアップ拡張」にも記載してあります。This same example is also shown in {Binding} markup extension.

設計時ツールの {StaticResource} マークアップ拡張のサポートDesign-time tools support for the {StaticResource} markup extension

Microsoft Visual Studio 2013 では、XAML ページで {StaticResource} マークアップ拡張を使うときに Microsoft IntelliSense のドロップダウンに可能なキー値を含めることができます。Microsoft Visual Studio 2013 can include possible key values in the Microsoft IntelliSense dropdowns when you use the {StaticResource} markup extension in a XAML page. たとえば、"{StaticResource" と入力するとすぐに、現在の検索範囲のリソース キーが IntelliSense のドロップダウンに表示されます。For example, as soon as you type "{StaticResource", any of the resource keys from the current lookup scope are displayed in the IntelliSense dropdowns. ページ レベル (FrameworkElement.Resources) とアプリ レベル (Application.Resources) で持つ一般的なリソースに加えて、XAML テーマ リソースと、プロジェクトで使っている拡張機能のリソースも表示されます。In addition to the typical resources you'd have at page level (FrameworkElement.Resources) and app level (Application.Resources), you also see XAML theme resources, and resources from any extensions your project is using.

{StaticResource} の一部としてリソース キーが存在すると、[定義へ移動] (F12 キー) 機能でそのリソースを解決して、リソースが定義されているディクショナリを表示できます。Once a resource key exists as part of any {StaticResource} usage, the Go To Definition (F12) feature can resolve that resource and show you the dictionary where it's defined. テーマ リソースの場合は、設計時の generic.xaml に移動します。For the theme resources, this goes to generic.xaml for design time.