Ricerca 
it-ITen-US
Registrazione
Accedi
 
Autore:  Patrizia Cosolo
Pubblicato il:  2007/08/13

L'Albero degli elementi
Come iniziare a capire com'è fatto WPF (parte 3)

Windows Presentation Foundation

Una panoramica sulla struttura dell'Albero degli elementi che compone il sistema di classi del WPF e funzionamento degli elementi principali, controlli contenitore e controlli contenuti.

 

Albero degli Elementi

In numerose tecnologie, elementi e componenti sono organizzati in una struttura ad Albero  che viene direttamente manipolata dagli sviluppatori per agire sul rendering di un’applicazione. Anche Windows Presentation Foundation (WPF) utilizza la metafora della struttura ad Albero per definire le relazioni fra gli elementi del programma.

Questo articolo contiene i seguenti argomenti

Alberi degli Elementi nel WPF

La struttura ad Albero in WPF è definita come Albero degli elementi. Se generate un'applicazione formata da una pagina in XAML, la struttura ad Albero creata sarà basata sulle relazioni fra gli elementi che si annidano nel markup. Se create un’applicazione in codice, allora la creazione della struttura ad Albero è basata sul modo in cui sono assegnati i valori alle proprietà, per le proprietà che implementano il modello di contenuto per un dato elemento. In Windows Presentation Foundation (WPF), in realtà ci sono due tipi di alberi degli elementi: l’Albero Logico e l’Albero Visuale. In molti casi, è l’Albero Logico che fornisce una visione intuitiva delle relazioni fra gli elementi in una applicazione, ed è questo Albero che generalmente create, quando scrivete del markup o del codice. Ma occasionalmente, è l’Albero Visuale che controlla o definisce il comportamento inerente alla struttura ad Albero.
Anche se non sempre manipolate direttamente l’Albero Logico o l’Albero Visuale, la comprensione dei concetti è un modo per capire come, l’ereditarietà delle property e gli eventi pilotati, lavorano in WFP.

L’Albero Logico

In WFP, aggiungete contenuto agli elementi utilizzando le proprietà. Per esempio, aggiungete articoli [items n.d.t.] al controllo ListBox usando la sua property Items. Così facendo, collocate articoli nella ItemCollection del controllo ListBox. Per aggiungere elementi ad un DockPanel, usate la sua property Children. A questo punto, state aggiungendo elementi alla UIElementCollection del DockPanel. Per un’esempio di codice, vedi Come Aggiungere Dinamicamente un Elemento How To: Dynamically Add an element.

Nel Linguaggio Estensibile di Markup per le Applicazioni (XAML), quando collocate una lista di articoli in una ListBox, o aggiungete controlli o altri elementi in un DockPanel, utilizzate sempre le proprietà Items e Children, sia esplicite che implicite, come mostra l’esempio seguente:

<DockPanel
  Name="ParentElement"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  
  <ListBox DockPanel.Dock="Top">
    
    <ListItem>
      <Paragraph>DogParagraph>
    ListItem>
    <ListItem>
      <Paragraph>CatParagraph>
    ListItem>
    <ListItem>
      <Paragraph>FishParagraph>
    ListItem>
    
  ListBox>
  <Button Height="20" Width="100" DockPanel.Dock="Top">
    Buy a PetButton>
  
DockPanel>

Osservate che i tags degli elementi di property, non sono esplicitamente necessari, perché il lettore della codifica XAML deduce gli elementi property nel momento in cui crea gli oggetti che generano la rappresentazione a runtime dell’oggetto eseguibile dell'applicazione. Per maggiori informazioni riguardo a come la sintassi di XAML mappa l’Albero Logico creato e deduce i tags, vedi Terminologia della Sintassi di XAML XAML Syntax Terminologyoppure Panoramica di XAML XAML Overview. Il seguente grafico fornisce una visione concettuale  dell’Albero Logico che è generato nell’esecuzione del run time (la diramazione per il bottone è omessa dal grafico).

Schema dell’aspetto di un generico Albero Logico

Schema dell'aspetto di un generico albero logico

L’Albero Visuale

In aggiunta al concetto dell’Albero Logico, esaminiamo ora il concetto dell’Albero Visuale in WPF. L’Albero Visuale descrive la struttura degli elementi visuali rappresentata dalla classe di base Visual. L’Albero Visuale è di massimo interesse per gli sviluppatori che, per ragioni di performance e di ottimizzazione,vogliono un livello di controllo più basso sulla grafica. Generalmente, l’Albero Visuale, non è un concetto esposto [exposed n.d.t.] agli sviluppatori che lavorano principalmente con i controlli esistenti e con la codifica XAML. Una dimostrazione del concetto di Albero Visuale come parte della programmazione di un’applicazione WPF convenzionale, è quella per cui i percorsi di un evento, per un evento pilotato, viaggiano lungo l’Albero Visuale anzichè lungo l’Albero Logico. Questo comportamento "di subaffitto" [sublety n.d.t.] da parte dell'evento pilotato potrebbe non essere immediatamente evidente, a meno che voi siate uno sviluppatore di controlli. Eseguire il routing tramite l’Albero Visuale, abilita i controlli che implementano la composizione a livello visuale, ad intercettare eventi o creare  EventSetters [posizionatori di eventi n.d.t.].

Alberi, Elementi di Contenuto (content elements) e Ospiti di Contenuto (Content hosts)

Gli elementi di contenuto (classi derivate di ContentElement) non sono parte dell’Albero Visuale; essi non ereditano dalla classe di base Visual e non hanno rappresentazione visiva. Per poter apparire in una UI, un ContentElement deve essere ospitato all’interno di un’Ospite di Contenuto che è un Visual, solitamente è un  FrameworkElement.
Per capire il concetto di ospite di contenuto, possiamo dire che esso è piuttosto simile ad un "browser" per il contenuto, e sceglie come visualizzare quel contenuto dentro  la regione di schermo che ospita i controlli. Una volta che il contenuto è "ospitato", esso può partecipare ad alcuni processi con la struttura ad Albero, normalmente associati all’Albero Visuale. Generalmente la classe ospite FrameworkElement comprende un codice di implementazione che aggiunge qualsiasi ContentElement ospitato al percorso degli eventi attraverso sotto-nodi[subnodes n.d.t.] dell’Albero logico del contenuto, nonostante il contenuto ospitato non sia veramente parte dell'Albero Visuale. Cio è necessario affinchè un ContentElement possa generare un’evento guidato che si instrada tutti gli elementi eccetto se stesso.

Lo Scopo dell’Albero Logico

La comprensione del concetto dell’Albero logico vi aiuterà a capire il modo in cui l’ereditarietà delle property lavora in WPF. Prendiamo in considerazione un DockPanel che contiene un controllo Button e un controllo TextBlock  Se impostate la property FontWeight su DockPanel, il controllo TextBlock eredita il valore della property FontWeight dall’elemento genitore DockPanel. Una property è ereditata sia dal suo genitore logico che da quello visuale, ma il genitore logico è utilizzato se entrambi i genitori sono presenti.

Oltre a quanto detto, i riferimenti alle risorsa sono risolti cercando, risalendo l’Albero logico, le collezioni Resources. Analogamente all’ereditarietà del valore della property, l’Albero logico è utilizzato per ricercare risorse quando, sia l’Albero logico che quello Visuale, sono presenti. Per maggiori informazioni sulle risorse, vedi Panoramica delle Risorse Resources Overview.

Attraversamento dell’Albero Logico

La classe LogicalTreeHelper fornisce le modalità GetChildren, GetParent e FindLogicalNode  per attraversare  [percorrere n.d.t.] l’Albero. Nella maggior parte dei casi, non dovrebbe servire attraversare l’Albero logico dei controlli esistenti, perchè i controlli quasi sempre propongono i loro figli logici come una property di tipo collezione specializzata, essa supporterà le APIs di collezione quali Add, indexer e così via. Attraversare l’Albero è principalmente uno scenario utilizzato dai progettisti di controlli, quando essi scelgono di non derivare dagli schemi [patterns n.d.t.] di controllo proposti, quali ItemsControl o Panel nei quali le property che espongono le collezioni sono già definite, ma intendono invece fornire supporto ad una propria collezione di property.

L’Albero Visuale supporta anche una classe helper per attraversare l’Albero, VisualTreeHelper. L’Albero Visuale non è esposto così semplicemente come un insieme di properties specifiche del controllo, perciò la classe VisualTreeHelper è il mezzo consigliato per attraversare l’Albero Visuale, se ciò si rende necessario, per la programmazione del vostro scenario. Per maggiori informazioni, vedi Panoramica del Rendering Grafico in Windows Presentation Foundation Windows Presentation Foundation Graphics Rendering Overview.

L'Overriding dell’Albero Logico

Gli autori di controlli più esperti [advanced n.d.t.] possono effettuare l'overriding dell’Albero logico mediante l'override di numerose APIs, che definiscono come un generico oggetto o modello di contenuto, aggiunge o toglie elementi all’interno dell’Albero logico. Per un’esempio di come effettuare l'overriding dell’Albero logico, vedi Come fare un Overriding dell’Albero Logico How to: Override the Logical Tree.

© 2007 Microsoft Corporation
Trademark information is available at http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx

Traduzione a cura di Patrizia Cosolo, Revisione tecnica a cura di Sabrina Cosolo.



       
Articoli|Webcast|Risorse|Utility
© 2007-2010 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.