Форматирование текста в TextBlock

105

Как добиться форматирования текста внутри элемента TextBlockуправления в моем приложении WPF?

Например: я хотел бы, чтобы некоторые слова были выделены жирным шрифтом, другие - курсивом, а некоторые - другим цветом, как в этом примере:

введите описание изображения здесь

Причина моего вопроса - это настоящая проблема:

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

Я бы хотел, чтобы вторая часть строки была полужирной, и я знаю, что могу использовать два элемента управления (метки, текстовые блоки и т. Д.), Но я бы не стал этого делать из-за большого количества уже используемых элементов управления.

Ясень
источник

Ответы:

142

Вам необходимо использовать 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>

С привязкой:

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

Вы также можете привязать другие свойства:

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

Вы можете привязать через конвертеры, если у вас полужирный шрифт как логическое (скажем).

ChrisF
источник
98

Вы можете сделать это в XAML достаточно легко:

<TextBlock>
  Hello <Bold>my</Bold> faithful <Underline>computer</Underline>.<Italic>You rock!</Italic>
</TextBlock>
Эшли Дэвис
источник
Чудесно! Я понятия не имел, что XAML поддерживает такие конструкции.
Аллон Гуралнек
6
поддерживает ли это привязку?
Арсен Мкртчян
11
@ArsenMkrt Как насчет: <TextBlock FontWeight = "Bold" Text = "{Binding Budget}" />
Aetherix
2
@Aetherix Я не мог заставить это работать. Я использовал это из qqbenq: <TextBlock> Ежемесячное погашение <Bold> £ </Bold> <Run FontWeight = "Bold" Text = "{Binding MonthlyPayment}" /> </TextBlock>
Гейл Фоад
49

Существуют различные Inlineэлементы, которые могут вам помочь, для простейших вариантов форматирования, которые вы можете использовать Bold, Italicа также Underline:

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

введите описание изображения здесь

Я думаю, стоит отметить, что эти элементы на самом деле являются сокращениями для Spanэлементов с различными установленными свойствами (например: для Bold, FontWeightсвойство установлено в FontWeights.Bold).

Это подводит нас к следующему варианту: вышеупомянутому Spanэлементу.

С помощью этого элемента вы можете добиться тех же эффектов, что и выше, но вам предоставляется еще больше возможностей; вы можете установить (среди прочего) свойства Foregroundили Background:

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

введите описание изображения здесь

SpanЭлемент может также содержать другие элементы , как это:

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

введите описание изображения здесь

Есть еще один элемент, который очень похож на Span, он называется Run. RunНе может содержать другие встроенные элементы в то время как Spanбанки, но вы можете легко связать с переменной к Run«s Textсобственности:

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

введите описание изображения здесь

Кроме того, вы можете выполнить все форматирование из кода программной части, если хотите:

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
источник
44

Посмотрите этот пример от 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
источник
7

хороший сайт, с хорошими пояснениями:

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

здесь автор дает вам хорошие примеры того, что вы ищете! В целом сайт отлично подходит для исследовательских материалов, а также охватывает множество вариантов, которые есть у вас в WPF.

редактировать

Существуют разные способы форматирования текста. для базового форматирования (на мой взгляд, самого простого):

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

В примере 1 показано базовое форматирование с полужирным курсивом и подчеркнутым текстом.

Ниже приведен метод SPAN, с помощью которого вы выделяете текст:

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

Пример 2 показывает функцию диапазона и различные возможности с ней.

Для подробного объяснения посетите сайт!

Примеры

Giellez
источник
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из отзыва
Ричард Слейтер
1
@Mogsdad отредактировал сообщение, чтобы в нем были показаны примеры кода
Giellez
@RichardSlater отредактировал сообщение, чтобы в нем были показаны примеры кода
Giellez
0

Это мое решение ....

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

Я учусь ... так что, если у кого-то есть проблемы с вышеуказанным решением, поделитесь! :)

Рори Сканлан
источник