Formatowanie tekstu w TextBlock

105

Jak uzyskać formatowanie tekstu wewnątrz TextBlockkontrolki w mojej aplikacji WPF?

np .: Chciałbym, aby niektóre słowa były pogrubione, inne kursywą, a niektóre w innych kolorach, jak w tym przykładzie:

wprowadź opis obrazu tutaj

Powodem mojego pytania jest ten rzeczywisty problem:

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

Chciałbym, aby druga część ciągu była pogrubiona i wiem, że mógłbym użyć dwóch kontrolek (etykiet, bloków tekstowych itp.), Ale wolałbym tego nie robić, ze względu na ogromną liczbę kontrolek już używanych.

Popiół
źródło

Odpowiedzi:

142

Musisz użyć 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>

Z wiązaniem:

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

Możesz również powiązać inne właściwości:

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

Możesz powiązać konwertery, jeśli masz pogrubienie jako wartość logiczna (powiedzmy).

ChrisF
źródło
98

Możesz to zrobić w XAML dość łatwo:

<TextBlock>
  Hello <Bold>my</Bold> faithful <Underline>computer</Underline>.<Italic>You rock!</Italic>
</TextBlock>
Ashley Davis
źródło
Wspaniale! Nie miałem pojęcia, że ​​XAML obsługuje takie konstrukcje.
Allon Guralnek
6
czy to obsługuje wiązanie?
Arsen Mkrtchyan,
11
@ArsenMkrt Co powiesz na: <TextBlock FontWeight = "Bold" Text = "{Binding Budget}" />
Aetherix,
2
@Aetherix Nie mogłem zmusić tego do pracy. Użyłem tego z qqbenq: <TextBlock> Miesięczna spłata <Bold> £ </Bold> <Run FontWeight = "Bold" Text = "{Binding MonthlyPayment}" /> </TextBlock>
Gail Foad
49

Istnieje wiele Inlineelementów, które mogą Ci pomóc, w zakresie najprostszych opcji formatowania, których możesz użyć Bold, Italicoraz Underline:

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

wprowadź opis obrazu tutaj

Myślę, że warto zauważyć, że te elementy są w rzeczywistości skrótami dla Spanelementów o różnych ustawionych właściwościach (np. Dla Bold, FontWeightwłaściwość jest ustawiona na FontWeights.Bold).

To prowadzi nas do naszej następnej opcji: wspomnianego wcześniej Spanelementu.

Dzięki temu elementowi możesz osiągnąć takie same efekty jak powyżej, ale masz jeszcze więcej możliwości; możesz ustawić (między innymi) Foregroundlub Backgroundwłaściwości:

<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>

wprowadź opis obrazu tutaj

SpanElement może również zawierać inne elementy, takie jak poniżej:

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

wprowadź opis obrazu tutaj

Jest jeszcze jeden element, który jest dość podobny do Span, to się nazywa Run. RunNie może zawierać inne elementy inline natomiast Spanmożna, ale można łatwo powiązać zmienną do Run„s Textnieruchomości:

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

wprowadź opis obrazu tutaj

Jeśli wolisz, możesz również wykonać całe formatowanie z poziomu kodu:

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.");
qqbenq
źródło
44

Zapoznaj się z przykładem z aplikacji 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;
        }
    }
}
Wegged
źródło
7

dobra strona, z dobrymi objaśnieniami:

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

tutaj autor podaje dobre przykłady tego, czego szukasz! Ogólnie strona jest świetna do materiałów badawczych, a ponadto obejmuje wiele opcji dostępnych w WPF

Edytować

Istnieją różne metody formatowania tekstu. za podstawowe formatowanie (moim zdaniem najłatwiejsze):

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

Przykład 1 przedstawia podstawowe formatowanie z pogrubioną czcionką i podkreśleniem.

Poniżej znajduje się metoda SPAN, w której możesz wyróżnić tekst:

   <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>

Przykład 2 pokazuje funkcję rozpiętości i różne jej możliwości.

Aby uzyskać szczegółowe wyjaśnienie, sprawdź stronę!

Przykłady

Giellez
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. - Z recenzji
Richard Slater
1
@Mogsdad zredagował post, aby zawierał przykłady kodu
Giellez
@RichardSlater zredagował post, więc pokazuje przykłady kodu
Giellez
0

To jest moje rozwiązanie ....

    <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>

Uczę się ... więc jeśli ktoś się śmieje na powyższym rozwiązaniu proszę o podziel się! :)

Rory Scanlan
źródło