Ereditarietà del valore della proprietàProperty Value Inheritance

L'ereditarietà del valore della proprietà è una funzionalità del sistema di proprietà 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. L'ereditarietà del valore della proprietà consente agli elementi figlio in un albero di elementi di ottenere il valore di una determinata proprietà dagli elementi padre, ereditando tale valore con le impostazioni specificate in un punto qualsiasi dell'elemento padre più vicino.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. Anche l'elemento padre potrebbe aver ottenuto il valore tramite l'ereditarietà del valore della proprietà, pertanto il sistema potrebbe procedere in modo ricorsivo fino alla radice della pagina.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. L'ereditarietà del valore della proprietà non è il comportamento predefinito del sistema di proprietà. È necessario stabilire una particolare impostazione dei metadati di una proprietà per fare in modo che quest'ultima attivi l'ereditarietà del valore per gli elementi figlio.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.

L'ereditarietà del valore della proprietà è un'ereditarietà di contenimentoProperty Value Inheritance Is Containment Inheritance

Il termine "ereditarietà" usato in questa sede non coincide perfettamente con il concetto di ereditarietà nel contesto dei tipi e in generale della programmazione orientata a oggetti, in cui le classi derivate ereditano le definizioni dei membri dalle rispettive classi di base."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. Questo significato di ereditarietà è valido anche in WPFWPF: le proprietà definite nelle varie classi di base sono esposte come attributi per le classi XAMLXAML derivate, se usate come elementi ed esposte come membri per il codice.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. L'ereditarietà del valore della proprietà riguarda in particolare il modo in cui i valori delle proprietà possono ereditare da un elemento a un altro in base alle relazioni padre-figlio all'interno di un albero di elementi.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. L'albero di elementi è visibile più direttamente quando si annidano elementi all'interno di altri elementi in fase di definizione delle applicazioni nel markup XAMLXAML.That tree of elements is most directly visible when nesting elements inside other elements as you define applications in XAMLXAML markup. Gli alberi di oggetti possono essere creati anche a livello di codice, aggiungendo oggetti a raccolte designate di altri oggetti. In questo caso la modalità di funzionamento dell'ereditarietà del valore della proprietà sarà la stessa nell'albero completato in fase di esecuzione.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.

Applicazioni pratiche dell'ereditarietà del valore della proprietàPractical Applications of Property Value Inheritance

Le WPFWPF API includono diverse proprietà con ereditarietà della proprietà abilitata.The WPFWPF APIs include several properties that have property inheritance enabled. In genere, lo scenario per queste proprietà prevede l'uso di una proprietà che possa essere impostata una sola volta per pagina, ma che sia anche un membro di una delle classi dell'elemento di base e quindi esista anche nella maggior parte degli elementi figlio.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. Ad esempio, la FlowDirection proprietà controlla la direzione in cui il contenuto propagato deve essere presentato e disposto nella pagina.For example, the FlowDirection property controls which direction flowed content should be presented and arranged on the page. Nella maggior parte dei casi si preferisce che il concetto di flusso del testo sia gestito coerentemente in tutti gli elementi figlio.Typically, you want the text flow concept to be handled consistently throughout all child elements. Se per qualche motivo la direzione del flusso è stata reimpostata in un livello dell'albero di elementi dall'utente o dall'ambiente, la reimpostazione deve essere in genere eseguita per tutta la struttura.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. Quando si FlowDirection crea la proprietà per ereditare, il valore deve essere impostato o reimpostato una sola volta al livello nell'albero degli elementi che comprende le esigenze di presentazione di ogni pagina dell'applicazione.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. Anche il valore predefinito iniziale userà l'ereditarietà nello stesso modo.Even the initial default value will inherit in this way. Il modello di ereditarietà del valore della proprietà consente in ogni caso ai singoli elementi di reimpostare il valore nelle rare occasioni in cui si sceglie intenzionalmente di usare una combinazione di direzioni di flusso.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.

Rendere ereditabile una proprietà personalizzataMaking a Custom Property Inheritable

Modificando i metadati di una proprietà personalizzata è possibile rendere ereditabili anche le proprietà di questo tipo.By changing a custom property's metadata, you can also make your own custom properties inheritable. Si noti, tuttavia, che quando si definisce una proprietà come ereditabile è necessario fare alcune considerazioni sulle prestazioni.Note, however, that designating a property as inheritable does have some performance considerations. Nei casi in cui quella proprietà non dispone di un valore locale stabilito oppure di un valore ottenuto tramite stili, modelli o data binding, una proprietà ereditabile fornisce i relativi valori di proprietà assegnati a tutti gli elementi figlio dell'albero logico.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.

Per fare in modo che una proprietà partecipi all'ereditarietà del valore, creare una proprietà associata personalizzata, come descritto in Registrare una proprietà associata.To make a property participate in value inheritance, create a custom attached property, as described in Register an Attached Property. Registrare la proprietà con i metadatiFrameworkPropertyMetadata() e specificare l'opzione "Inherits" nelle impostazioni delle opzioni all'interno dei metadati.Register the property with metadata (FrameworkPropertyMetadata) and specify the "Inherits" option in the options settings within that metadata. Verificare quindi che la proprietà abbia un valore predefinito stabilito, perché quel valore sarà ereditato.Also make sure that the property has an established default value, because that value will now inherit. Anche se la proprietà è stata registrata come associata, può essere necessario creare un "wrapper" della proprietà per ottenere o impostare l'accesso sul tipo di proprietario, come si farebbe per una proprietà di dipendenza non associata.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. Al termine di questa operazione, è possibile impostare la proprietà ereditabile usando il wrapper della proprietà Direct sul tipo di proprietario o sui tipi derivati oppure è possibile impostarla usando la sintassi della proprietà DependencyObjectassociata per qualsiasi.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.

Le proprietà associate sono concettualmente simili alle proprietà globali. è possibile verificare il valore in qualsiasi DependencyObject e ottenere un risultato valido.Attached properties are conceptually similar to global properties; you can check for the value on any DependencyObject and get a valid result. Lo scenario tipico per le proprietà associate è quello di impostare i valori delle proprietà negli elementi figlio e tale scenario è più efficace se la proprietà in questione è una proprietà associata che è sempre presente in modo implicito come proprietà associata in ogni elemento (DependencyObject) nell'albero.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.

Nota

Anche se può sembrare che l'ereditarietà del valore della proprietà funzioni per le proprietà di dipendenza non associate, il comportamento di ereditarietà per una proprietà non associata tramite certi limiti di elementi nell'albero della fase di esecuzione non è definito.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. Usare RegisterAttached sempre per registrare le proprietà specificate Inherits nei metadati.Always use RegisterAttached to register properties where you specify Inherits in the metadata.

Eredità dei valori di proprietà attraverso i limiti dell'alberoInheriting Property Values Across Tree Boundaries

L'ereditarietà delle proprietà funziona mediante il passaggio attraverso un albero di elementi.Property inheritance works by traversing a tree of elements. Quest'albero spesso è parallelo all'albero logico.This tree is often parallel to the logical tree. Tuttavia, ogni volta che si include un oggetto a livello di core WPF nel markup che definisce un albero degli elementi, Brushad esempio, è stato creato un albero logico discontinuo.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. Un vero albero logico non si estende concettualmente attraverso Brush, perché l'albero logico è un concetto a livello di Framework WPF.A true logical tree does not conceptually extend through the Brush, because the logical tree is a WPF framework-level concept. È possibile osservare questo riflesso nei risultati quando si utilizzano i metodi di LogicalTreeHelper.You can see this reflected in the results when using the methods of LogicalTreeHelper. Tuttavia, l'ereditarietà del valore della proprietà può colmare questo gap nell'albero logico e può comunque passare i valori ereditati fino a quando la proprietà ereditabile è stata registrata come proprietà associata e nessun limite di blocco dell'ereditarietà intenzionale (ad esempio, Frame) rilevato.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.

Vedere ancheSee also