プロパティ値の継承Property Value Inheritance

プロパティ値の継承は、Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) プロパティ システムの機能です。Property value inheritance is a feature of the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) property system. プロパティ値の継承により、要素のツリー内の子要素は、親要素から特定のプロパティの値を取得できます。これは、最も近い親要素のいずれかに設定されているとおりにその値を継承することで行われます。Property value inheritance enables child elements in a tree of elements to obtain the value of a particular property from parent elements, inheriting that value as it was set anywhere in the nearest parent element. 親要素もプロパティ値の継承を通じてその値を取得している場合があるため、システムはページ ルートまで再帰している可能性があります。The parent element might also have obtained its value through property value inheritance, so the system potentially recurses all the way to the page root. プロパティ値の継承は、プロパティ システムの既定の動作ではありません。あるプロパティに子要素でのプロパティ値の継承を実行させるには、そのプロパティに特定のメタデータを設定する必要があります。Property value inheritance is not the default property system behavior; a property must be established with a particular metadata setting in order to cause that property to initiate property value inheritance on child elements.

プロパティ値の継承は包含継承であるProperty Value Inheritance Is Containment Inheritance

ここで言う "継承" は、型や一般的なオブジェクト指向プログラミングのコンテキストにおける継承 (派生クラスがその基底クラスからメンバー定義を継承する) とは若干異なる概念です。"Inheritance" as a term here is not quite the same concept as inheritance in the context of types and general object-oriented programming, where derived classes inherit member definitions from their base classes. この意味での継承は、WPFWPF でも使用されます。さまざまな基底クラスで定義されたプロパティは、要素として使用される場合の派生 XAMLXAML クラスの属性として、およびコードのメンバーとして公開されます。That meaning of inheritance is also active in WPFWPF: properties defined in various base classes are exposed as attributes for derived XAMLXAML classes when used as elements, and exposed as members for code. プロパティ値の継承は、要素のツリー内の親子のリレーションシップに基づいて、ある要素から別の要素にプロパティ値が継承されるしくみに特に関連します。Property value inheritance is particularly about how property values can inherit from one element to another on the basis of the parent-child relationships within a tree of elements. その要素のツリーが最も直接的に認識されるのは、XAMLXAML マークアップでアプリケーションを定義する際にさまざまな要素を別の要素内に入れ子にする場合です。That tree of elements is most directly visible when nesting elements inside other elements as you define applications in XAMLXAML markup. オブジェクトのツリーはプログラムで作成することもできます。これを行うには、オブジェクトを別のオブジェクトの指定したコレクションに追加します。完成したツリーでも、実行時にプロパティ値の継承が同様に動作します。Trees of objects can also be created programmatically by adding objects to designated collections of other objects, and property value inheritance works the same way in the finished tree at run time.

プロパティ値の継承を実際の応用例Practical Applications of Property Value Inheritance

Api WPFWPFには、プロパティの継承が有効になっているいくつかのプロパティが含まれています。The WPFWPF APIs include several properties that have property inheritance enabled. これらのプロパティの一般的なシナリオは次のとおりです。これらのプロパティは、ページごとに一度だけ設定するのが適していますが、いずれかの基本要素クラスのメンバーでもあるため、ほとんどの子要素にも存在することになります。Typically, the scenario for these is that they involve a property where it is appropriate that the property be set only once per page, but where that property is also a member of one of the base element classes and thus would also exist on most of the child elements. たとえば、プロパティはFlowDirection 、フローされたコンテンツをページ上に表示し、配置する方向を制御します。For example, the FlowDirection property controls which direction flowed content should be presented and arranged on the page. 通常、テキスト フローの概念は、すべての子要素で一貫して処理される必要があります。Typically, you want the text flow concept to be handled consistently throughout all child elements. 要素ツリーのあるレベルにおいて、何らかの理由でユーザーまたは環境の操作によってフロー方向がリセットされた場合は、一般に要素全体でリセットする必要があります。If flow direction were for some reason reset in some level of the element tree by user or environment action, it should typically be reset throughout. FlowDirectionプロパティを継承する場合、値を設定またはリセットする必要があるのは、アプリケーション内の各ページのプレゼンテーションのニーズを含む要素ツリーのレベルで1回だけです。When the FlowDirection property is made to inherit, the value need only be set or reset once at the level in the element tree that encompasses the presentation needs of each page in the application. 初期既定値であっても、同様の方法で値を継承します。Even the initial default value will inherit in this way. プロパティ値の継承モデルでは、要素の値を個別にリセットすることもできます。これは、複数のフロー方向の混在を意図したまれなケースに対応するためです。The property value inheritance model still enables individual elements to reset the value for the rare cases where having a mix of flow directions is intentional.

カスタム プロパティを継承可能にするMaking a Custom Property Inheritable

カスタム プロパティのメタデータを変更することで、独自のカスタム プロパティを継承可能にすることもできます。By changing a custom property's metadata, you can also make your own custom properties inheritable. ただし、プロパティを継承可能にする場合は、パフォーマンスについて考慮する必要があります。Note, however, that designating a property as inheritable does have some performance considerations. ローカル値や、スタイル、テンプレート、またはデータ バインディングから取得した値がそのプロパティに設定されていない場合、継承可能なプロパティは、それ自身に割り当てられた値を論理ツリー内のすべての子要素に提供します。In cases where that property does not have an established local value, or a value obtained through styles, templates, or data binding, an inheritable property provides its assigned property values to all child elements in the logical tree.

プロパティを値の継承に参加させるには、「添付プロパティを登録する」の説明に従ってカスタム添付プロパティを作成します。To make a property participate in value inheritance, create a custom attached property, as described in Register an Attached Property. プロパティをメタデータ (FrameworkPropertyMetadata) に登録し、そのメタデータ内のオプション設定で "Inherits" オプションを指定します。Register the property with metadata (FrameworkPropertyMetadata) and specify the "Inherits" option in the options settings within that metadata. また、値が継承されるようになったため、プロパティに既定値が設定されていることも確認します。Also make sure that the property has an established default value, because that value will now inherit. プロパティを添付プロパティとして登録しましたが、"非添付" の依存関係プロパティの場合と同様に、所有者型で get アクセスおよび set アクセスのプロパティ "ラッパー" を作成することもできます。Although you registered the property as attached, you might also want to create a property "wrapper" for get/set access on the owner type, just as you would for an "nonattached" dependency property. その後、継承可能なプロパティは、所有者の型または派生型の直接プロパティラッパーを使用して設定するか、または任意DependencyObjectので添付プロパティの構文を使用して設定できます。After doing so, the inheritable property can either be set by using the direct property wrapper on the owner type or derived types, or it can be set by using the attached property syntax on any DependencyObject.

添付プロパティは、概念的にはグローバルプロパティに似ています。任意DependencyObjectのの値を確認し、有効な結果を取得することができます。Attached properties are conceptually similar to global properties; you can check for the value on any DependencyObject and get a valid result. 添付プロパティの一般的なシナリオでは、子要素にプロパティ値を設定します。問題のプロパティが添付プロパティである場合は、該当するプロパティが、各要素の添付プロパティとして常に暗黙的に提示されます (DependencyObject) をツリー内で行います。The typical scenario for attached properties is to set property values on child elements, and that scenario is more effective if the property in question is an attached property that is always implicitly present as an attached property on each element (DependencyObject) in the tree.

注意

プロパティ値の継承は、非添付依存関係プロパティについても機能しているように見えることがありますが、ランタイム ツリーでの特定の要素の境界を介する非添付プロパティの継承動作は定義されていません。Although property value inheritance might appear to work for nonattached dependency properties, the inheritance behavior for a nonattached property through certain element boundaries in the run-time tree is undefined. メタデータRegisterAttachedで指定Inheritsするプロパティを登録するには、常にを使用します。Always use RegisterAttached to register properties where you specify Inherits in the metadata.

ツリー境界を越えてプロパティ値を継承するInheriting Property Values Across Tree Boundaries

プロパティの継承は、要素のツリーを走査して行われます。Property inheritance works by traversing a tree of elements. 多くの場合、このツリーは論理ツリーに対応します。This tree is often parallel to the logical tree. ただし、などの要素ツリーを定義するマークアップに WPF コアレベルのオブジェクトを含めると、連続しBrushていない論理ツリーが作成されます。However, whenever you include a WPF core-level object in the markup that defines an element tree, such as a Brush, you have created a discontinuous logical tree. 論理ツリーは WPF フレームワークレベルの概念であるBrushため、真の論理ツリーは概念的にはを通じて拡張されません。A true logical tree does not conceptually extend through the Brush, because the logical tree is a WPF framework-level concept. LogicalTreeHelperメソッドを使用すると、結果に反映されていることを確認できます。You can see this reflected in the results when using the methods of LogicalTreeHelper. ただし、プロパティ値の継承では、論理ツリー内でこのギャップを埋めることができます。継承可能なプロパティが添付プロパティとして登録されており、意図的に継承をブロックするFrame境界がない限り() が発生しました。However, property value inheritance can bridge this gap in the logical tree and can still pass inherited values through, so long as the inheritable property was registered as an attached property and no deliberate inheritance-blocking boundary (such as a Frame) is encountered.

関連項目See also