martedì 5 luglio 2011

Logical- and Visual Tree

Introduzione
Elementi di una interfaccia utente WPF sono collegate gerarchicamente. Questa relazione si chiama LogicalTree. Il modello di un elemento è costituito da più elementi visivi. Questo albero è chiamato VisualTree. WPF differisce tra i due alberi, perché per alcuni problemi è necessario solo gli elementi logici e per altri problemi si desidera che tutti gli elementi.

<Window>
<Grid>
<label Content="Label" />
<Button Content="Button" />
</ Grid></ Window>

Perché abbiamo bisogno di due diversi tipi di alberi?
Un controllo WPF è costituito da più, controlli più primitivo. Un tasto - per esempio - è costituito da un bordo, un rettangolo e un presentatore contenuto. Questi controlli sono figli visivo del pulsante.
Quando WPF rende il pulsante, lo stesso elemento non ha l'aspetto, ma si scorre l'albero visuale e rende i bambini visivo di esso. Questa relazione gerarchica può essere utilizzato anche per fare hit testing, layout, ecc
Ma a volte non siete interessati ai confini e rettangoli di un modello di un controllo '. Particolarmente perché il modello può essere sostituito, e quindi non dovrebbe riguardare la struttura ad albero visuale! A causa di ciò si vuole un albero più robusto che contiene solo i "veri" controlli - e non tutte le parti modello. E questo è l'idoneità per l'albero logico.
L'albero logico
L'albero logico descrive le relazioni tra gli elementi dell'interfaccia utente. L'albero logico è responsabile per:
• Eredita valori DependencyProperty• Risoluzione DynamicResources riferimenti• Ricerca di nomi di elementi per le associazioni• RoutedEvents Forwaring

Il Visual Tree
La struttura ad albero visuale contiene tutti gli elementi logici compresi tutti gli elementi visivi del modello di ogni elemento. La struttura visiva è responsabile di: • Elementi di rendering visivo• Propaga opacità elemento• Propaga Layout e RenderTransforms• Propagare la proprietà IsEnabled.• Do Hit-Testing• RelativeSource (FindAncestor)

Trova un antenato di programmazione in Visual Tree
Se sei un elemento figlio di una interfaccia utente e si desidera accedere ai dati da un elemento padre, ma non sai quanti livelli fino Elemens che è, è la migliore soluzione per navigare l'albero fino a trovare un elemento di il tipo richiesto.
Questo helper fa excactly questo. È possibile utilizzare praticamente lo stesso codice per navigare attraverso l'albero logico.

pubblico VisualTreeHelperExtensions classe statica{
public static T FindAncestor <T> (DependencyObject DependencyObject)
dove T: classe
{
DependencyObject target = DependencyObject;
fare
{
target = VisualTreeHelper.GetParent (target);
}
while (target = null & & bersaglio (è T)!);
obiettivo di rendimento come T;
}}

L'esempio seguente mostra come utilizzare l'helper. Si parte da questo e naviga la struttura visiva finché non trova un elemento di rete tipo. Se il soccorritore raggiunge l'elemento radice dell'albero, restituisce null.

var grid = VisualTreeHelperExtensions.FindAncestor <Grid> (this);

Nessun commento:

Posta un commento