XAML リソースXAML Resources

リソースは、アプリケーションのさまざまな場所で再利用できるオブジェクトです。A resource is an object that can be reused in different places in your application. リソースの例としては、ブラシやスタイルなどがあります。Examples of resources include brushes and styles. この概要では、のXAMLXAMLリソースを使用する方法について説明します。This overview describes how to use resources in XAMLXAML. また、コードを使用してリソースを作成してアクセスしたり、 Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML)コードとを区別したりすることもできます。You can also create and access resources by using code, or interchangeably between code and Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML). 詳細については、「リソースとコード」を参照してください。For more information, see Resources and Code.

注意

このトピックで説明するリソースファイルは、「 WPF アプリケーションリソース、コンテンツ、およびデータファイル」で説明されているリソースファイルとは異なり、「アプリケーションリソースの管理 (.net)」で説明されている埋め込みリソースまたはリンクされたリソースとは異なりますThe resource files described in this topic are different than the resource files described in WPF Application Resource, Content, and Data Files and different than the embedded or linked resources described in Manage Application Resources (.NET).

XAML でのリソースの使用Using Resources in XAML

次の例ではSolidColorBrush 、ページのルート要素のリソースとしてを定義します。The following example defines a SolidColorBrush as a resource on the root element of a page. 次に、リソースを参照し、このリソースを使用してEllipse TextBlock、、 Button、などのいくつかの子要素のプロパティを設定します。The example then references the resource and uses it to set properties of several child elements, including an Ellipse, a TextBlock, and a Button.

<Page Name="root"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  <Page.Resources>
    <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
    <Style TargetType="Border" x:Key="PageBackground">
      <Setter Property="Background" Value="Blue"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="TitleText">
      <Setter Property="Background" Value="Blue"/>
      <Setter Property="DockPanel.Dock" Value="Top"/>
      <Setter Property="FontSize" Value="18"/>
      <Setter Property="Foreground" Value="#4E87D4"/>
      <Setter Property="FontFamily" Value="Trebuchet MS"/>
      <Setter Property="Margin" Value="0,40,10,10"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="Label">
      <Setter Property="DockPanel.Dock" Value="Right"/>
      <Setter Property="FontSize" Value="8"/>
      <Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
      <Setter Property="FontFamily" Value="Arial"/>
      <Setter Property="FontWeight" Value="Bold"/>
      <Setter Property="Margin" Value="0,3,10,0"/>
    </Style>
  </Page.Resources>
  <StackPanel>
    <Border Style="{StaticResource PageBackground}">
      <DockPanel>
        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>
        <TextBlock DockPanel.Dock="Top" HorizontalAlignment="Left" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
        <Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
        <Ellipse DockPanel.Dock="Top" HorizontalAlignment="Left" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="40" />
      </DockPanel>
    </Border>
  </StackPanel>
</Page>


すべてのフレームワークレベル要素 (FrameworkElementまたFrameworkContentElementは) にResourcesは、リソースを定義するリソース (としてResourceDictionary) を含むプロパティであるプロパティがあります。Every framework-level element (FrameworkElement or FrameworkContentElement) has a Resources property, which is the property that contains the resources (as a ResourceDictionary) that a resource defines. 任意の要素にリソースを定義できます。You can define resources on any element. ただし、多くの場合、リソースはルート要素 (例ではPage ) で定義されています。However, resources are most often defined on the root element, which is Page in the example.

リソースディクショナリ内の各リソースには、一意のキーが必要です。Each resource in a resource dictionary must have a unique key. マークアップでリソースを定義する場合は、 X:Key ディレクティブを使用して一意のキーを割り当てます。When you define resources in markup, you assign the unique key through the x:Key Directive. 通常、キーは文字列です。ただし、適切なマークアップ拡張機能を使用して、他のオブジェクトの種類に設定することもできます。Typically, the key is a string; however, you can also set it to other object types by using the appropriate markup extensions. リソースの文字列以外のキーはWPFWPF、の特定の機能領域 (特に、スタイル、コンポーネントリソース、データスタイル) で使用されます。Nonstring keys for resources are used by certain feature areas in WPFWPF, notably for styles, component resources, and data styling.

リソースを定義した後、キー名を指定するリソースマークアップ拡張構文を使用して、プロパティ値に使用するリソースを参照できます。次に例を示します。After you define a resource, you can reference the resource to be used for a property value by using a resource markup extension syntax that specifies the key name, for example:

<Button Background="{StaticResource MyBrush}"/>
<Ellipse Fill="{StaticResource MyBrush}"/>

前の例では、ローダー XAMLXAMLがのButton {StaticResource MyBrush} Backgroundプロパティの値を処理するときに、リソース検索ロジックButtonはまず、要素のリソースディクショナリをチェックします。In the preceding example, when the XAMLXAML loader processes the value {StaticResource MyBrush} for the Background property on Button, the resource lookup logic first checks the resource dictionary for the Button element. Buttonリソースキー MyBrushの定義がない (そのリソースコレクションが空である) 場合、参照は次にのButton親要素を確認します (つまりPage、)。If Button does not have a definition of the resource key MyBrush (it does not; its resource collection is empty), the lookup next checks the parent element of Button, which is Page. したがって、 Pageルート要素でリソースを定義すると、 Pageの論理ツリー内のすべての要素がそのリソースにアクセスできるようになります。また、同じリソースを再利用して、リソースTypeに対するを受け入れるプロパティの値を設定することもできます。を.Thus, when you define a resource on the Page root element, all the elements in the logical tree of the Page can access it, and you can reuse the same resource for setting the value of any property that accepts the Type that the resource represents. 前の例では、同じMyBrushリソースによって、 Fill BackgroundButton Rectangleとのの2つの異なるプロパティが設定されています。In the previous example, the same MyBrush resource sets two different properties: the Background of a Button, and the Fill of a Rectangle.

静的および動的なリソースStatic and Dynamic Resources

リソースは、静的リソースと動的リソースのどちらかとして参照できます。A resource can be referenced as either a static resource or a dynamic resource. これは、 StaticResource マークアップ拡張機能またはDynamicresource マークアップ拡張機能のいずれかを使用して行います。This is done by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. マークアップ拡張機能は、マークXAMLXAMLアップ拡張機能によって属性文字列を処理し、オブジェクトをXAMLXAMLローダーに返すことで、オブジェクト参照を指定できるようにする機能です。A markup extension is a feature of XAMLXAML whereby you can specify an object reference by having the markup extension process the attribute string and return the object to a XAMLXAML loader. マークアップ拡張機能の動作の詳細については、「マークアップ拡張機能と WPF XAML」を参照してください。For more information about markup extension behavior, see Markup Extensions and WPF XAML.

マークアップ拡張機能を使用する場合、通常は、設定されるプロパティのコンテキストで評価されるのではなく、特定のマークアップ拡張機能によって処理される1つ以上のパラメーターを文字列形式で指定します。When you use a markup extension, you typically provide one or more parameters in string form that are processed by that particular markup extension, rather than being evaluated in the context of the property being set. StaticResource マークアップ拡張機能は、使用可能なすべてのリソースディクショナリでそのキーの値を検索することによって、キーを処理します。The StaticResource Markup Extension processes a key by looking up the value for that key in all available resource dictionaries. 読み込み中に発生します。これは、読み込みプロセスが静的リソース参照を受け取るプロパティ値を割り当てる必要がある時点です。This happens during loading, which is the point in time when the loading process needs to assign the property value that takes the static resource reference. 代わりに、 Dynamicresource マークアップ拡張機能は、式を作成することによってキーを処理します。この式は、アプリケーションが実際に実行されるまで未評価のままです。その時点で、式が評価され、値が提供されます。The DynamicResource Markup Extension instead processes a key by creating an expression, and that expression remains unevaluated until the application is actually run, at which time the expression is evaluated and provides a value.

リソースを参照する場合、次の考慮事項は、静的リソース参照と動的リソース参照のどちらを使用するかに影響する可能性があります。When you reference a resource, the following considerations can influence whether you use a static resource reference or a dynamic resource reference:

  • アプリケーションのリソースを作成する方法の全体的な設計 (リソースのみのアセンブリでは、アプリケーション内でXAMLXAMLは、アプリケーション内では疎ではありません)。The overall design of how you create the resources for your application (per page, in the application, in loose XAMLXAML, in a resource only assembly).

  • アプリケーションの機能: アプリケーションの要件のリアルタイムの部分でリソースを更新していますか。The application functionality: is updating resources in real time part of your application requirements?

  • そのリソース参照型のそれぞれの参照動作。The respective lookup behavior of that resource reference type.

  • 特定のプロパティまたはリソースの種類、およびそれらの型のネイティブな動作。The particular property or resource type, and the native behavior of those types.

静的リソースStatic Resources

静的リソース参照は、次のような状況に最も適しています。Static resource references work best for the following circumstances:

  • アプリケーションの設計では、すべてのリソースのほとんどがページまたはアプリケーションレベルのリソースディクショナリに集中しています。Your application design concentrates most of all of its resources into page or application level resource dictionaries. 静的リソース参照は、ページの再読み込みなどの実行時の動作に基づいて再評価されることはないため、リソースごとに不要な動的リソース参照を大量に回避すると、パフォーマンス上の利点があります。アプリケーションの設計。Static resource references are not reevaluated based on runtime behaviors such as reloading a page, and therefore there can be some performance benefit to avoiding large numbers of dynamic resource references when they are not necessary per your resource and application design.

  • DependencyObjectまたはにないプロパティの値を設定しようとしています。FreezableYou are setting the value of a property that is not on a DependencyObject or a Freezable.

  • DLL にコンパイルされるリソースディクショナリを作成し、アプリケーションの一部としてパッケージ化するか、アプリケーション間で共有します。You are creating a resource dictionary that will be compiled into a DLL, and packaged as part of the application or shared between applications.

  • カスタムコントロールのテーマを作成し、テーマ内で使用されるリソースを定義します。You are creating a theme for a custom control, and are defining resources that are used within the themes. この場合、動的リソース参照の参照動作は通常は必要ありません。代わりに、静的なリソース参照の動作を使用して、参照が予測可能であり、テーマに自己完結している必要があります。For this case, you typically do not want the dynamic resource reference lookup behavior, you instead want the static resource reference behavior so that the lookup is predictable and self-contained to the theme. 動的リソース参照を使用すると、テーマ内の参照が実行可能になるまでは評価されません。また、テーマが適用されると、テーマが参照しようとしているキーが一部のローカル要素によって再定義され、ローカル要素が前になります。検索でテーマ自体に。With a dynamic resource reference, even a reference within a theme is left unevaluated until runtime, and there is a chance that when the theme is applied, some local element will redefine a key that your theme is trying to reference, and the local element will fall prior to the theme itself in the lookup. そのような場合は、テーマが期待どおりに動作しません。If that happens, your theme will not behave in an expected manner.

  • リソースを使用して、多数の依存関係プロパティを設定しています。You are using resources to set large numbers of dependency properties. 依存関係プロパティの有効な値のキャッシュは、プロパティシステムによって有効になります。したがって、読み込み時に評価できる依存関係プロパティの値を指定する場合、依存関係プロパティは再評価式を確認する必要がなく、最後の有効な値。Dependency properties have effective value caching as enabled by the property system, so if you provide a value for a dependency property that can be evaluated at load time, the dependency property does not have to check for a reevaluated expression and can return the last effective value. この手法は、パフォーマンス上の利点があります。This technique can be a performance benefit.

  • すべてのコンシューマーの基になるリソースを変更する必要がある場合、またはX:Shared 属性を使用してコンシューマーごとに個別の書き込み可能インスタンスを保持する場合。You want to change the underlying resource for all consumers, or you want to maintain separate writable instances for each consumer by using the x:Shared Attribute.

静的リソース参照の動作Static resource lookup behavior

  1. 参照プロセスは、プロパティを設定する要素によって定義されたリソースディクショナリ内で、要求されたキーを確認します。The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. 次に、参照プロセスによって論理ツリーが上位に、親要素とそのリソースディクショナリに向かって走査されます。The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. これは、ルート要素に到達するまで続行されます。This continues until the root element is reached.

  3. 次に、アプリケーションリソースが確認されます。Next, application resources are checked. アプリケーションリソースは、 Application WPFWPFアプリケーションのオブジェクトによって定義されたリソースディクショナリ内のリソースです。Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

リソースディクショナリ内からの静的リソース参照は、リソース参照の前に既に定義されているリソースを参照する必要があります。Static resource references from within a resource dictionary must reference a resource that has already been defined lexically before the resource reference. 前方参照は、静的リソース参照によって解決できません。Forward references cannot be resolved by a static resource reference. このため、静的なリソース参照を使用する場合は、リソースディクショナリの構造を設計する必要があります。これは、リソースを使用することを目的としたリソースが、それぞれのリソースディクショナリの先頭に定義されているか、その近くに定義されているかを示します。For this reason, if you use static resource references, you must design your resource dictionary structure such that resources intended for by-resource use are defined at or near the beginning of each respective resource dictionary.

静的リソース参照は、テーマまたはシステムリソースに拡張できますが、これはローダーがXAMLXAML要求を延期することによってのみサポートされます。Static resource lookup can extend into themes, or into system resources, but this is supported only because the XAMLXAML loader defers the request. 遅延は、ページが読み込まれるときのランタイムテーマがアプリケーションに適切に適用されるようにするために必要です。The deferral is necessary so that the runtime theme at the time the page loads applies properly to the application. ただし、にのみ存在することがわかっているキーへの静的リソース参照は、テーマまたはシステムリソースとしてのみ存在することをお勧めします。However, static resource references to keys that are known to only exist in themes or as system resources are not recommended. これは、ユーザーがリアルタイムでテーマを変更した場合に、このような参照が再評価されないためです。This is because such references are not reevaluated if the theme is changed by the user in realtime. 動的リソース参照は、テーマまたはシステムリソースを要求するときに信頼性が高くなります。A dynamic resource reference is more reliable when you request theme or system resources. 例外は、テーマ要素自体が別のリソースを要求する場合です。The exception is when a theme element itself requests another resource. これらの参照は、前述の理由により、静的なリソース参照である必要があります。These references should be static resource references, for the reasons mentioned earlier.

静的リソース参照が見つからない場合の例外動作は異なります。The exception behavior if a static resource reference is not found varies. リソースが遅延された場合は、実行時に例外が発生します。If the resource was deferred, then the exception occurs at runtime. リソースが遅延されていない場合は、読み込み時に例外が発生します。If the resource was not deferred, the exception occurs at load time.

動的リソースDynamic Resources

動的リソースは、次のような状況で最適に機能します。Dynamic resources work best for the following circumstances:

  • リソースの値は、ランタイムまで不明な条件に依存します。The value of the resource depends on conditions that are not known until runtime. これには、システムリソース、またはユーザーが設定できるリソースが含まれます。This includes system resources, or resources that are otherwise user settable. たとえば、、 SystemColors SystemFonts、またはSystemParametersによって公開されているシステムプロパティを参照する setter 値を作成できます。For example, you can create setter values that refer to system properties, as exposed by SystemColors, SystemFonts, or SystemParameters. これらの値は、最終的にユーザーおよびオペレーティングシステムのランタイム環境から取得されるため、真に動的です。These values are truly dynamic because they ultimately come from the runtime environment of the user and operating system. また、変更できるアプリケーションレベルのテーマがある場合もあります。この場合、ページレベルのリソースへのアクセスでも変更をキャプチャする必要があります。You might also have application-level themes that can change, where page-level resource access must also capture the change.

  • カスタムコントロールのテーマスタイルを作成または参照している。You are creating or referencing theme styles for a custom control.

  • アプリケーションの有効期間ResourceDictionary中にの内容を調整する場合。You intend to adjust the contents of a ResourceDictionary during an application lifetime.

  • 相互依存関係を持つ複雑なリソース構造があり、前方参照が必要になる場合があります。You have a complicated resource structure that has interdependencies, where a forward reference may be required. 静的リソース参照では前方参照はサポートされていませんが、動的リソース参照では、リソースをランタイムに評価する必要がなく、前方参照が関連する概念ではないため、動的リソース参照はこれらをサポートします。Static resource references do not support forward references, but dynamic resource references do support them because the resource does not need to be evaluated until runtime, and forward references are therefore not a relevant concept.

  • コンパイルまたはワーキングセットの観点から特に大きいリソースを参照しているため、ページの読み込み時にリソースがすぐには使用されない可能性があります。You are referencing a resource that is particularly large from the perspective of a compile or working set, and the resource might not be used immediately when the page loads. 静的リソース参照は、ページXAMLXAMLが読み込まれるときに常に読み込まれます。ただし、動的リソース参照は、実際に使用されるまで読み込まれません。Static resource references always load from XAMLXAML when the page loads; however, a dynamic resource reference does not load until it is actually used.

  • テーマまたはその他のユーザー設定の影響を受ける他の値からセッター値が取得される可能性があるスタイルを作成しています。You are creating a style where setter values might come from other values that are influenced by themes or other user settings.

  • アプリケーションの有効期間中に論理ツリー内で親される可能性のある要素にリソースを適用しています。You are applying resources to elements that might be reparented in the logical tree during application lifetime. 親を変更すると、リソースルックアップスコープも変更される可能性があるため、新しいスコープに基づいて親要素のリソースを再評価するには、常に動的リソース参照を使用します。Changing the parent also potentially changes the resource lookup scope, so if you want the resource for a reparented element to be reevaluated based on the new scope, always use a dynamic resource reference.

動的リソース参照の動作Dynamic resource lookup behavior

動的リソース参照のリソース参照動作は、またはFindResource SetResourceReferenceを呼び出すと、コードの参照動作と同じです。Resource lookup behavior for a dynamic resource reference parallels the lookup behavior in your code if you call FindResource or SetResourceReference.

  1. 参照プロセスは、プロパティを設定する要素によって定義されたリソースディクショナリ内で、要求されたキーを確認します。The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. 次に、参照プロセスによって論理ツリーが上位に、親要素とそのリソースディクショナリに向かって走査されます。The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary. これは、ルート要素に到達するまで続行されます。This continues until the root element is reached.

  3. 次に、アプリケーションリソースが確認されます。Next, application resources are checked. アプリケーションリソースは、 Application WPFWPFアプリケーションのオブジェクトによって定義されたリソースディクショナリ内のリソースです。Application resources are those resources within the resource dictionary that is defined by the Application object for your WPFWPF application.

  4. 現在アクティブなテーマのテーマリソースディクショナリがチェックされます。Theme resource dictionary is checked, for the currently active theme. 実行時にテーマが変更された場合、値は再評価されます。If the theme changes at runtime, the value is reevaluated.

  5. システムリソースがチェックされます。System resources are checked.

例外の動作 (存在する場合) は、次のように異なります。Exception behavior (if any) varies:

  • リソースがFindResource呼び出しによって要求され、が見つからなかった場合は、例外が発生します。If a resource was requested by a FindResource call, and was not found, an exception is raised.

  • リソースがTryFindResource呼び出しによって要求され、が見つからなかった場合は、例外は発生しませんがnull、戻り値はになります。If a resource was requested by a TryFindResource call, and was not found, no exception is raised, but the returned value is null. 設定するプロパティがを受け入れnullない場合でも、より深い例外が発生する可能性があります (これは、設定されている個々のプロパティによって異なります)。If the property being set does not accept null, then it is still possible that a deeper exception will be raised (this depends on the individual property being set).

  • リソースがのXAMLXAML動的リソース参照によって要求され、見つからなかった場合、動作は一般的なプロパティシステムによって異なりますが、一般的な動作は、リソースが存在するレベルでプロパティ設定操作が行われなかった場合と同じです。If a resource was requested by a dynamic resource reference in XAMLXAML, and was not found, then the behavior depends on the general property system, but the general behavior is as if no property setting operation occurred at the level where the resource exists. たとえば、評価できないリソースを使用して個々の button 要素の背景を設定しようとした場合、値は設定されませんが、プロパティシステムと値の優先順位の他の参加者から有効な値を取得できます。For instance, if you attempt to set the background on a an individual button element using a resource that could not be evaluated, then no value set results, but the effective value can still come from other participants in the property system and value precedence. たとえば、背景値は、ローカルに定義されたボタンスタイルまたはテーマスタイルから取得される場合があります。For instance, the background value might still come from a locally defined button style, or from the theme style. テーマスタイルで定義されていないプロパティの場合、リソースの評価に失敗した後の有効値は、プロパティメタデータの既定値から取得される可能性があります。For properties that are not defined by theme styles, the effective value after a failed resource evaluation might come from the default value in the property metadata.

制約Restrictions

動的リソース参照には、いくつかの注目すべき制限があります。Dynamic resource references have some notable restrictions. 少なくとも次のいずれかが true である必要があります。At least one of the following must be true:

設定するプロパティはプロパティDependencyPropertyまたはFreezableプロパティである必要があるため、プロパティの変更 (動的リソース値の変更) がプロパティシステムによって確認されるため、ほとんどのプロパティ変更が UI に反映される可能性があります。Because the property being set must be a DependencyProperty or Freezable property, most property changes can propagate to UI because a property change (the changed dynamic resource value) is acknowledged by the property system. ほとんどのコントロールには、 DependencyProperty変更やそのプロパティがレイアウトに影響を与える可能性がある場合に、コントロールの別のレイアウトを強制的に適用するロジックが含まれます。Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. ただし、 Dynamicresource マークアップ拡張機能が値として使用されているすべてのプロパティでは、UI でリアルタイムに更新されるように値を提供することが保証されています。However, not all properties that have a DynamicResource Markup Extension as their value are guaranteed to provide the value in such a way that they update in realtime in the UI. この機能は、プロパティによって異なりますが、プロパティを所有する型やアプリケーションの論理構造によっても異なる場合があります。That functionality still might vary depending on the property, as well as depending on the type that owns the property, or even the logical structure of your application.

スタイル、DataTemplates、および暗黙のキーStyles, DataTemplates, and Implicit Keys

前に、内のResourceDictionaryすべての項目にキーが必要であることが示されていました。Earlier, it was stated that all items in a ResourceDictionary must have a key. ただし、これは、すべてのリソースに明示的x:Keyなが必要であるという意味ではありません。However, that does not mean that all resources must have an explicit x:Key. オブジェクトの種類によっては、リソースとして定義されている場合、キー値が別のプロパティの値に関連付けられている場合に、暗黙的なキーをサポートします。Several object types support an implicit key when defined as a resource, where the key value is tied to the value of another property. これは暗黙のキー x:Keyとして知られていますが、属性は明示的なキーです。This is known as an implicit key, whereas an x:Key attribute is an explicit key. 明示的なキーを指定することで、暗黙のキーを上書きできます。You can overwrite any implicit key by specifying an explicit key.

リソースの非常に重要なシナリオの1つはStyle、を定義する場合です。One very important scenario for resources is when you define a Style. 実際、は、 Styleスタイルが本質的に再利用されることを意図しているため、ほとんどの場合、リソースディクショナリ内のエントリとして定義されます。In fact, a Style is almost always defined as an entry in a resource dictionary, because styles are inherently intended for reuse. スタイルの詳細については、「スタイルとテンプレート」を参照してください。For more information about styles, see Styling and Templating.

コントロールのスタイルは、を使用して作成することも、暗黙的なキーを使用して参照することもできます。Styles for controls can be both created with and referenced with an implicit key. コントロールの既定の外観を定義するテーマスタイルは、この暗黙のキーに依存します。The theme styles that define the default appearance of a control rely on this implicit key. 要求の観点から見た暗黙のキーは、 Typeコントロール自体のです。The implicit key from the standpoint of requesting it is the Type of the control itself. リソースの定義の観点からの暗黙のキーはTargetType 、スタイルのです。The implicit key from the standpoint of defining the resource is the TargetType of the style. したがって、カスタムコントロールのテーマを作成していて、既存のテーマスタイルと対話するスタイルを作成している場合は、そのStyleに対してx:Key ディレクティブを指定する必要はありません。Therefore, if you are creating themes for custom controls, creating styles that interact with existing theme styles, you do not need to specify an x:Key Directive for that Style. また、テーマ付きスタイルを使用する場合は、スタイルを指定する必要はありません。And if you want to use the themed styles, you do not need to specify any style at all. たとえば、次のスタイル定義は、 Styleリソースがキーを持っていないように見える場合でも動作します。For instance, the following style definition works, even though the Style resource does not appear to have a key:

<Style TargetType="Button">
  <Setter Property="Background">
    <Setter.Value>
      <LinearGradientBrush>
        <GradientStop Offset="0.0" Color="AliceBlue"/>
        <GradientStop Offset="1.0" Color="Salmon"/>           
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>  
  <Setter Property="FontSize" Value="18"/>
</Style>

このスタイルには、暗黙のキー typeof( Button )というキーが実際に含まれています。That style really does have a key: the implicit key typeof(Button). マークアップでは、を型TargetType名として直接指定できます (または、必要に応じて{x:Type...}を使用することもできます)。In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} を返す場合Typeは。to return a Type.

によっWPFWPFて使用される既定のテーマスタイル機構を使用して、そのスタイルはButton 、そのStyleプロパティまたは特定のButtonリソースを指定しようとしない場合でも、ページ上ののランタイムスタイルとして適用されます。スタイルへの参照。Through the default theme style mechanisms used by WPFWPF, that style is applied as the runtime style of a Button on the page, even though the Button itself does not attempt to specify its Style property or a specific resource reference to the style. ページで定義されているスタイルは、テーマ辞書のスタイルと同じキーを使用して、参照シーケンスの前にテーマディクショナリのスタイルよりも前にあります。Your style defined in the page is found earlier in the lookup sequence than the theme dictionary style, using the same key that the theme dictionary style has. ページ内の任意<Button>Hello</Button>Button場所を指定するだけで、でTargetType定義したスタイルがそのボタンに適用されます。You could just specify <Button>Hello</Button> anywhere in the page, and the style you defined with TargetType of Button would apply to that button. 必要に応じて、マークアップでわかりやすくするために、とTargetType同じ型の値を持つスタイルを明示的にキー指定することもできますが、これは省略可能です。If you want, you can still explicitly key the style with the same type value as TargetType, for clarity in your markup, but that is optional.

がの場合OverridesDefaultStyle 、スタイルの暗黙のキーはコントロールに適用されませOverridesDefaultStyleん (これはtrue 、コントロールのインスタンスで明示的にではなく、コントロールクラスのネイティブ動作の一部として設定されることもあります)。Implicit keys for styles do not apply on a control if OverridesDefaultStyle is true (also note that OverridesDefaultStyle might be set as part of native behavior for the control class, rather than explicitly on an instance of the control). また、派生クラスのシナリオで暗黙のキーをサポートするには、コントロールDefaultStyleKeyをオーバーライドする必要があります ( WPFWPFの一部として提供されるすべての既存のコントロール)。Also, in order to support implicit keys for derived class scenarios, the control must override DefaultStyleKey (all existing controls provided as part of WPFWPF do this). スタイル、テーマ、およびコントロールのデザインの詳細については、「スタイルコントロールを設計するためのガイドライン」を参照してください。For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplateには、暗黙のキーもあります。DataTemplate also has an implicit key. DataTemplate暗黙のキー DataTypeは、プロパティ値です。The implicit key for a DataTemplate is the DataType property value. DataTypeは、 {x:Type...}を明示的に使用するのではなく、型の名前として指定することもできます。DataType can also be specified as the name of the type rather than explicitly using {x:Type...}. 詳細については、「データテンプレートの概要」を参照してください。For details, see Data Templating Overview.

関連項目See also