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. 例では、リソースを参照しなどのいくつかの子要素のプロパティを設定するため、 EllipseTextBlock、および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ローダーは、値を処理{StaticResource MyBrush}BackgroundプロパティButton、リソースの検索ロジックは最初のリソース ディクショナリにチェック、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リソースは、2 つの異なるプロパティを設定:BackgroundButton、およびFillRectangleします。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またはFreezableします。You 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. 依存関係プロパティでは、有効な値がプロパティ システムによって有効になっているため、読み込み時に評価される依存関係プロパティの値を指定する場合、依存関係プロパティ reevaluated 式を確認する必要はありませんおよび返すことができますをキャッシュします最後の有効な値。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: 共有属性します。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. によって公開されていると、システムのプロパティを参照する set アクセス操作子の値を作成するなどSystemColorsSystemFonts、またはSystemParametersします。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.

  • Set アクセス操作子の値がテーマやその他のユーザー設定の影響を受けるその他の値を元のスタイルを作成します。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. たとえばの背景を設定しようとした場合、評価できないリソースを使用して、個々 のボタン要素値の設定はありません、結果がプロパティ システムと値の優先順位の他の参加者から有効な値が決まることができます。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. 次の少なくとも 1 つは 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.

スタイル、Datatemplate、および暗黙的なキー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. そのため、カスタム コントロールのテーマを作成する場合、既存のテーマ スタイルを使用して対話するスタイルを作成する必要はありませんを指定する、 X:key ディレクティブStyleします。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 ページで、場合でも、Button自体を指定しません、Styleプロパティまたは特定のリソーススタイルへの参照します。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> ページで、およびスタイルで定義されている任意の場所でTargetTypeButtonそのボタンに適用されます。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.

場合、スタイルの暗黙的なキーは、コントロールに適用されませんOverridesDefaultStyletrue(またを注意OverridesDefaultStyleネイティブの動作、コントロール クラスではなく明示的に、コントロールのインスタンスの一部として設定することがあります)。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