Установка текста 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: думаю, мой вопрос был недостаточно ясен. Чего я действительно пытаюсь достичь, так это:
- пользователь введите текст в RichTextBox.
- приложение сохраняет пользовательский ввод как
FlowDocument
С RichTextBox, и сериализует его на диск. - на
FlowDocument
десериализуется с диска на переменную текст. - теперь, я хотел бы быть в состоянии представить текст в
TextBlock
.
поэтому, насколько я понимаю, создание нового выполнить объект и настройка параметры вручную не решат мою проблему.
проблема в том, что сериализация RichTextBox создает раздел "объект", который я не могу добавить элемент TextBlock.Inlines. Поэтому невозможно установить для десериализованного объекта значение TextProperty of TextBlock.
4 ответов
Я знаю, что TextBlock может представить FlowDocument
что заставляет вас так думать ? Не думаю, что это правда... Содержание a TextBlock
- Это Inlines
свойство, которое является InlineCollection
. Поэтому он может содержать только Inline
s... Но в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.