2015-03-28 15 views
13

In un'applicazione WPF (o anche in un'applicazione Windows 8 o 8.1) sono disponibili tre modi per aggiungere un testo in un controllo.Run vs. Content vs. Text in WPF

  1. Run elemento all'interno dell'elemento TextBlock

    <TextBlock> 
        <Run>My text</Run> 
    </TextBlock> 
    
  2. Text proprietà come attributo TextBlock elemento

    <TextBlock Text="My text" /> 
    
  3. Text proprietà come elemento all'interno dell'elemento TextBlock

    <TextBlock> 
        <TextBlock.Text>my text</TextBlock.Text> 
    </TextBlock>` 
    

Quali sono le differenze tra questi tre approcci? E perché è necessario utilizzare Text per un TextBlock e Content per un ComboboxItem?

+0

C'è una documentazione online e anche un paio di buoni libri su WPF, dove questi controlli e le loro differenze sono spiegati in dettaglio. – Clemens

+0

@Hein come sei riuscito a compilare 3. e 4.? Potresti aggiungere altro codice? Nella mia applicazione di esempio non viene compilato – Domysee

risposta

24

Un controllo con una proprietà Text può solo accettare una stringa e viene eseguito il rendering in un modo specifico gestito da tale controllo. Esempi di tali controlli sono TextBlock e TextBox.

I controlli con una proprietà Content possono avere letteralmente uno qualsiasi object impostato su quella proprietà. Questi controlli inoltrano generalmente il valore alla proprietà Content su un ContentPresenter. La documentazione ContentPresenter Class ha questo blocco rilevanti:

Il ContentPresenter utilizza la seguente logica per visualizzare il contenuto:

  • Se la proprietà ContentTemplate sul ContentPresenter è impostato, il ContentPresenter applica che DataTemplate per la proprietà Content e l'UIElement risultante e i suoi elementi figli, se presenti, vengono visualizzati. Per ulteriori informazioni sugli oggetti DataTemplate, vedere Panoramica Templatura dati.
  • Se la proprietà ContentTemplateSelector in ContentPresenter è impostata, ContentPresenter applica il DataTemplate appropriato alla proprietà Content e UIElement risultante e i relativi elementi figli, se presenti, vengono visualizzati.
  • Se esiste un DataTemplate associato al tipo di contenuto, il ContentPresenter applica la proprietà DataTemplate alla proprietà Content e l'UIElement risultante e i relativi elementi figli, se presenti, vengono visualizzati.
  • Se il contenuto è un oggetto UIElement, viene visualizzato UIElement. Se UIElement ha già un genitore, si verifica un'eccezione.
  • Se è presente un TypeConverter che converte il tipo di contenuto in un UIElement, ContentPresenter utilizza tale TypeConverter e viene visualizzato UIElement risultante.
  • Se è presente un TypeConverter che converte il tipo di contenuto in una stringa, ContentPresenter utilizza quel TypeConverter e crea un TextBlock per contenere quella stringa. Viene visualizzato il TextBlock.
  • Se il contenuto è un XmlElement, il valore della proprietà InnerText viene visualizzato in un TextBlock.
  • ContentPresenter chiama il metodo ToString sul contenuto e crea un oggetto TextBlock per contenere la stringa restituita da ToString. Viene visualizzato il TextBlock.

Nel caso della classe TextBlock, si ha l'opzione di impostare la proprietà Text, o impostare la proprietà Inlines. Impostando Text verrà semplicemente visualizzato il testo. L'impostazione Inlines (che è l'impostazione predefinita se si inserisce il contenuto nel corpo del tag xaml) consente di formattare il testo. Ad esempio, è possibile utilizzare Run con FontWeight impostato su Bold per rendere in grassetto una determinata parola o frase all'interno di una frase. È possibile utilizzare LineBreak per inserire una nuova riga. È anche possibile utilizzare InlineUIContainer per inserire elementi di interfaccia utente personalizzati nel testo. Tutto ciò che deriva dalla classe Inline può andare in questa raccolta.

TextBlock è inteso per semplici bit di testo formattato. Se si desiderano funzionalità di stile documento ancora più potenti, è possibile esaminare FlowDocument, utilizzato da controlli come RichTextBox, FlowDocumentScrollViewer e FlowDocumentReader.

Per quanto riguarda la differenza tra <TextBlock Text="something" /> e <TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>, in realtà non c'è differenza. Questi sono semplicemente due modi diversi con cui è possibile impostare le proprietà su qualcosa in un file xaml. La seconda versione viene solitamente utilizzata solo quando è necessario definire ulteriori elementi all'interno del setter.

4

Una breve parola sulla 'elementi di proprietà'

Questo è solo un ulteriore osservazione su Xaviers grande risposta.

Infatti non v'è molta differenza tra:

<TextBlock Text="something" /> 

e

<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock> 

Ecco perché la proprietà Text è di tipo String che è un tipo semplice che può essere impostato direttamente come Text="something".

L'ultima sintassi nell'esempio precedente è denominata "elementi di proprietà". In genere viene utilizzato quando si imposta l'attributo di un elemento su un tipo complesso.

Esempio:

<Button> 
    <Button.Content> 
    <Rectangle Height="20", Width="20", Fill="Black"/> 
    </Button.Content> 
</Button> 

In questo esempio, si potrebbe propably impostare il 'rettangolo' direttamente senza utilizzare Button.Content, ma per altri esempi della sintassi può essere utilizzato per impostare un attributo di tipo complesso.