Formatieren von Text in einem TextBlock

104

Wie kann ich einen Text in einem TextBlockSteuerelement in meiner WPF-Anwendung formatieren ?

Beispiel: Ich möchte bestimmte Wörter fett, andere kursiv und einige in verschiedenen Farben haben, wie in diesem Beispiel:

Geben Sie hier die Bildbeschreibung ein

Der Grund für meine Frage ist dieses eigentliche Problem:

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

Ich möchte, dass der zweite Teil der Zeichenfolge fett gedruckt wird, und ich weiß, dass ich zwei Steuerelemente (Labels, TextBlocks usw.) verwenden kann, aber ich möchte dies lieber nicht, da bereits viele Steuerelemente verwendet werden.

Asche
quelle

Antworten:

139

Sie müssen verwenden 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>

Mit Bindung:

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

Sie können auch die anderen Eigenschaften binden:

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

Sie können durch Konverter binden, wenn Sie als Boolescher Wert fett sind (sagen wir).

ChrisF
quelle
98

Sie können dies in XAML ganz einfach tun:

<TextBlock>
  Hello <Bold>my</Bold> faithful <Underline>computer</Underline>.<Italic>You rock!</Italic>
</TextBlock>
Ashley Davis
quelle
Wunderbar! Ich hatte keine Ahnung, dass XAML solche Konstrukte unterstützt.
Allon Guralnek
6
unterstützt dies die Bindung?
Arsen Mkrtchyan
11
@ArsenMkrt Wie wäre es mit: <TextBlock FontWeight = "Bold" Text = "{Binding Budget}" />
Aetherix
2
@Aetherix Ich konnte das nicht zum Laufen bringen. Ich habe dies von qqbenq verwendet: <TextBlock> Monatliche Rückzahlung von <Bold> £ </ Bold> <Run FontWeight = "Bold" Text = "{Binding MonthlyPayment}" /> </ TextBlock>
Gail Foad
49

Es gibt verschiedene InlineElemente , die Sie für die einfachste Formatierungsoptionen helfen können , die Sie verwenden können Bold, Italicund Underline:

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

Geben Sie hier die Bildbeschreibung ein

Ich denke, es ist erwähnenswert, dass diese Elemente in der Tat nur Abkürzungen für SpanElemente mit verschiedenen Eigenschaften sind (dh: für Bold, die FontWeightEigenschaft ist auf gesetzt FontWeights.Bold).

Dies bringt uns zu unserer nächsten Option: dem oben genannten SpanElement.

Sie können mit diesem Element die gleichen Effekte wie oben erzielen, erhalten jedoch noch mehr Möglichkeiten. Sie können (unter anderem) die Foregroundoder die BackgroundEigenschaften festlegen :

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

Geben Sie hier die Bildbeschreibung ein

Das SpanElement kann auch andere Elemente wie das folgende enthalten:

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

Geben Sie hier die Bildbeschreibung ein

Es gibt ein anderes Element, das ziemlich ähnlich ist Span, es heißt Run. Das Runkann keine anderen Inline-Elemente enthalten, während das Spankann, aber Sie können eine Variable einfach an die Eigenschaft des Run' binden Text:

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

Geben Sie hier die Bildbeschreibung ein

Sie können die gesamte Formatierung auch von Code-Behind aus durchführen, wenn Sie Folgendes bevorzugen:

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

Schauen Sie sich dieses Beispiel aus Charles Petzolds Bool Application = Code + Markup an

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

Eine gute Seite mit guten Erklärungen:

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

Hier gibt Ihnen der Autor gute Beispiele für das, was Sie suchen! Insgesamt eignet sich die Website hervorragend für Forschungsmaterial und deckt eine Vielzahl von Optionen ab, die Sie in WPF haben

Bearbeiten

Es gibt verschiedene Methoden, um den Text zu formatieren. für eine grundlegende Formatierung (meiner Meinung nach die einfachste):

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

Beispiel 1 zeigt Grundformatierung mit Bold Itallic und unterstrichenen Text.

Im Folgenden finden Sie die SPAN-Methode, mit der Sie Text hervorheben können:

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

Beispiel 2 zeigt die Span-Funktion und die verschiedenen Möglichkeiten damit.

Eine ausführliche Erklärung finden Sie auf der Website!

Beispiele

Giellez
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Aus dem Rückblick
Richard Slater
1
@Mogsdad hat den Beitrag so bearbeitet, dass er Beispiele für den Code zeigt
Giellez
@ RichardSlater hat den Beitrag so bearbeitet, dass er Beispiele für den Code zeigt
Giellez
0

Das ist meine Lösung ....

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

Ich lerne ... also wenn jemand Gedanken über die obige Lösung hat, teile sie bitte mit! :) :)

Rory Scanlan
quelle