Установка текста WPF в TextBlock

Я знаю, что TextBlock может FlowDocument, например:

<TextBlock Name="txtFont">
     <Run Foreground="Maroon" FontFamily="Courier New" FontSize="24">Courier New 24</Run>
</TextBlock>

Я хотел бы знать, как установить FlowDocument, который хранится в переменной TextBlock. Я ищу что-то вроде:

string text = "<Run Foreground="Maroon" FontFamily="Courier New" FontSize="24">Courier New 24</Run>"
txtFont.Text = text;

однако результатом приведенного выше кода является то, что текст XAML представлен неупорядоченным.


EDIT: думаю, мой вопрос был недостаточно ясен. Чего я действительно пытаюсь достичь, так это:

  1. пользователь введите текст в RichTextBox.
  2. приложение сохраняет пользовательский ввод как FlowDocument С RichTextBox, и сериализует его на диск.
  3. на FlowDocument десериализуется с диска на переменную текст.
  4. теперь, я хотел бы быть в состоянии представить текст в TextBlock.

поэтому, насколько я понимаю, создание нового выполнить объект и настройка параметры вручную не решат мою проблему.


проблема в том, что сериализация RichTextBox создает раздел "объект", который я не могу добавить элемент TextBlock.Inlines. Поэтому невозможно установить для десериализованного объекта значение TextProperty of TextBlock.

4 ответов


Я знаю, что TextBlock может представить FlowDocument

что заставляет вас так думать ? Не думаю, что это правда... Содержание a TextBlock - Это Inlines свойство, которое является InlineCollection. Поэтому он может содержать только Inlines... Но вFlowDocument содержимое элемента Blocks свойство, которое содержит экземпляры Block. И Block - это не Inline


создайте и добавьте объект, как показано ниже:

        Run run = new Run("Courier New 24");
        run.Foreground = new SolidColorBrush(Colors.Maroon);
        run.FontFamily = new FontFamily("Courier New");
        run.FontSize = 24;
        txtFont.Inlines.Add(run);

Если FlowDocument была десериализовать, это означает, что у вас есть объект типа FlowDocument, да? Попробуйте установить для свойства Text вашего TextBlock это значение. Конечно, вы не можете сделать это с помощью txtFont.Text = ..., так как это работает только для строк. Для других типов объектов необходимо установить DependencyProperty напрямую:

txtFont.SetValue(TextBlock.TextProperty, myFlowDocument)

вот как мы устанавливаем внешний вид textblock, назначая стиль на лету.

    // Set Weight (Property setting is a string like "Bold")
    FontWeight thisWeight = (FontWeight)new FontWeightConverter().ConvertFromString(Properties.Settings.Default.DealerMessageFontWeightValue);

    // Set Color (Property setting is a string like "Red" or "Black")
    SolidColorBrush thisColor = (SolidColorBrush)new BrushConverter().ConvertFromString(Properties.Settings.Default.DealerMessageFontColorValue);

    // Set the style for the dealer message
    // Font Family Property setting  is a string like "Arial"
    // Font Size Property setting is an int like 12, a double would also work
    Style newStyle = new Style
    {
        TargetType = typeof(TextBlock),
        Setters = {
            new Setter 
            {
                Property = Control.FontFamilyProperty,
                Value = new FontFamily(Properties.Settings.Default.DealerMessageFontValue)
            },
            new Setter
            {
                Property = Control.FontSizeProperty,
                Value = Properties.Settings.Default.DealerMessageFontSizeValue
            },
            new Setter
            {
                Property = Control.FontWeightProperty,
                Value = thisWeight
            },
            new Setter
            {
                Property = Control.ForegroundProperty,
                Value = thisColor
            }
        }
    };

    textBlock_DealerMessage.Style = newStyle;

вы можете устранить раздел стиля и установить свойства напрямую, но нам нравится держать вещи в комплекте в стиле, чтобы помочь нам организовать внешний вид по всему проекту.

textBlock_DealerMessage.FontWeight = thisWeight;

HTH.