Formattazione del testo in un TextBlock


104

Come posso ottenere la formattazione di un testo all'interno di un TextBlockcontrollo nella mia applicazione WPF?

es: vorrei avere alcune parole in grassetto, altre in corsivo e alcune in colori diversi, come questo esempio:

inserisci qui la descrizione dell'immagine

Il motivo alla base della mia domanda è questo problema reale:

lblcolorfrom.Content = "Colour From: " + colourChange.ElementAt(3).Value.ToUpper();

Vorrei che la seconda parte della stringa fosse in grassetto e so che potrei usare due controlli (Labels, TextBlocks, ecc.) Ma preferisco di no, a causa dell'enorme quantità di controlli già in uso.

Risposte:


139

Devi usare Inlines:

<TextBlock.Inlines>
    <Run FontWeight="Bold" FontSize="14" Text="This is WPF TextBlock Example. " />
    <Run FontStyle="Italic" Foreground="Red" Text="This is red text. " />
</TextBlock.Inlines>

Con rilegatura:

<TextBlock.Inlines>
    <Run FontWeight="Bold" FontSize="14" Text="{Binding BoldText}" />
    <Run FontStyle="Italic" Foreground="Red" Text="{Binding ItalicText}" />
</TextBlock.Inlines>

Puoi anche associare le altre proprietà:

<TextBlock.Inlines>
    <Run FontWeight="{Binding Weight}"
         FontSize="{Binding Size}"
         Text="{Binding LineOne}" />
    <Run FontStyle="{Binding Style}"
         Foreground="Binding Colour}"
         Text="{Binding LineTwo}" />
</TextBlock.Inlines>

Puoi eseguire il binding tramite convertitori se hai grassetto come booleano (ad esempio).


98

Puoi farlo in XAML abbastanza facilmente:

<TextBlock>
  Hello <Bold>my</Bold> faithful <Underline>computer</Underline>.<Italic>You rock!</Italic>
</TextBlock>

Meraviglioso! Non avevo idea che XAML supportasse tali costrutti.
Allon Guralnek

6
questo supporta l'associazione?
Arsen Mkrtchyan

11
@ArsenMkrt Che ne dici: <TextBlock FontWeight = "Bold" Text = "{Binding Budget}" />
Aetherix

2
@ Aetherix non sono riuscito a farlo funzionare. Ho usato questo da qqbenq: <TextBlock> Rimborso mensile di <Bold> £ </Bold> <Run FontWeight = "Bold" Text = "{Binding MonthlyPayment}" /> </TextBlock>
Gail Foad

49

Ce ne sono di vari Inline elementi che possono aiutare, per le semplici opzioni di formattazione che è possibile utilizzare Bold, Italice Underline:

<TextBlock>
    Sample text with <Bold>bold</Bold>, <Italic>italic</Italic> and <Underline>underlined</Underline> words.
</TextBlock>

inserisci qui la descrizione dell'immagine

Penso che valga la pena notare che questi elementi sono in realtà solo scorciatoie per Spanelementi con varie proprietà impostate (cioè: per Bold, la FontWeightproprietà è impostata su FontWeights.Bold).

Questo ci porta alla nostra prossima opzione: l' Spanelemento di cui sopra .

Puoi ottenere gli stessi effetti con questo elemento come sopra, ma ti vengono concesse ancora più possibilità; puoi impostare (tra le altre) Foregroundle Backgroundproprietà o :

<TextBlock>
    Sample text with <Span FontWeight="Bold">bold</Span>, <Span FontStyle="Italic">italic</Span> and <Span TextDecorations="Underline">underlined</Span> words. <Span Foreground="Blue">Coloring</Span> <Span Foreground="Red">is</Span> <Span Background="Cyan">also</Span> <Span Foreground="Silver">possible</Span>.
</TextBlock>

inserisci qui la descrizione dell'immagine

L' Spanelemento può contenere anche altri elementi come questo:

<TextBlock>
    <Span FontStyle="Italic">Italic <Span Background="Yellow">text</Span> with some <Span Foreground="Blue">coloring</Span>.</Span>
</TextBlock>

inserisci qui la descrizione dell'immagine

C'è un altro elemento, che è abbastanza simile a Span, si chiama Run. Il Runnon può contenere altri elementi inline mentre ilSpan barattolo, ma si può facilmente associare una variabile al Run's Textdi proprietà:

<TextBlock>
    Username: <Run FontWeight="Bold" Text="{Binding UserName}"/>
</TextBlock>

inserisci qui la descrizione dell'immagine

Inoltre, puoi eseguire l'intera formattazione dal code-behind se preferisci:

TextBlock tb = new TextBlock();
tb.Inlines.Add("Sample text with ");
tb.Inlines.Add(new Run("bold") { FontWeight = FontWeights.Bold });
tb.Inlines.Add(", ");
tb.Inlines.Add(new Run("italic ") { FontStyle = FontStyles.Italic });
tb.Inlines.Add("and ");
tb.Inlines.Add(new Run("underlined") { TextDecorations = TextDecorations.Underline });
tb.Inlines.Add("words.");

44

Dai un'occhiata a questo esempio da Charles Petzolds Bool Application = Code + markup

//----------------------------------------------
// FormatTheText.cs (c) 2006 by Charles Petzold
//----------------------------------------------
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Documents;

namespace Petzold.FormatTheText
{
    class FormatTheText : Window
    {
        [STAThread]
        public static void Main()
        {
            Application app = new Application();
            app.Run(new FormatTheText());
        }
        public FormatTheText()
        {
            Title = "Format the Text";

            TextBlock txt = new TextBlock();
            txt.FontSize = 32; // 24 points
            txt.Inlines.Add("This is some ");
            txt.Inlines.Add(new Italic(new Run("italic")));
            txt.Inlines.Add(" text, and this is some ");
            txt.Inlines.Add(new Bold(new Run("bold")));
            txt.Inlines.Add(" text, and let's cap it off with some ");
            txt.Inlines.Add(new Bold(new Italic (new Run("bold italic"))));
            txt.Inlines.Add(" text.");
            txt.TextWrapping = TextWrapping.Wrap;

            Content = txt;
        }
    }
}

7

un buon sito, con buone spiegazioni:

http://www.wpf-tutorial.com/basic-controls/the-textblock-control-inline-formatting/

qui l'autore ti dà buoni esempi di quello che stai cercando! Nel complesso il sito è ottimo per il materiale di ricerca e copre una grande quantità di opzioni che hai in WPF

modificare

Esistono diversi metodi per formattare il testo. per una formattazione di base (la più semplice secondo me):

    <TextBlock Margin="10" TextWrapping="Wrap">
                    TextBlock with <Bold>bold</Bold>, <Italic>italic</Italic> and <Underline>underlined</Underline> text.
    </TextBlock>

L'esempio 1 mostra la formattazione di base con testo in grassetto itallico e sottolineato.

Di seguito è incluso il metodo SPAN, con questo puoi evidenziare il testo:

   <TextBlock Margin="10" TextWrapping="Wrap">
                    This <Span FontWeight="Bold">is</Span> a
                    <Span Background="Silver" Foreground="Maroon">TextBlock</Span>
                    with <Span TextDecorations="Underline">several</Span>
                    <Span FontStyle="Italic">Span</Span> elements,
                    <Span Foreground="Blue">
                            using a <Bold>variety</Bold> of <Italic>styles</Italic>
                    </Span>.
   </TextBlock>

L'esempio 2 mostra la funzione span e le diverse possibilità con essa.

Per una spiegazione dettagliata controlla il sito!

Esempi


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere le parti essenziali della risposta qui e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - Dalla recensione
Richard Slater

1
@Mogsdad ha modificato il post in modo da mostrare esempi del codice
Giellez

@RichardSlater ha modificato il post in modo da mostrare esempi del codice
Giellez

0

Questa è la mia soluzione ...

    <TextBlock TextWrapping="Wrap" Style="{DynamicResource InstructionStyle}"> 
        <Run Text="This wizard will take you through the purge process in the correct order." FontWeight="Bold"></Run>
        <LineBreak></LineBreak>
        <Run Text="To Begin, select" FontStyle="Italic"></Run>
        <Run x:Name="InstructionSection" Text="'REPLACED AT RUNTIME'" FontWeight="Bold"></Run>
        <Run Text="from the menu." FontStyle="Italic"></Run>
    </TextBlock>

Sto imparando ... quindi se qualcuno ha delle idee sulla soluzione di cui sopra, condividila! :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.