C# 构建具有粗体和斜体标记文本的框架元素的最简单方法是什么?

C# 构建具有粗体和斜体标记文本的框架元素的最简单方法是什么?,c#,wpf,xaml,bold,italic,C#,Wpf,Xaml,Bold,Italic,有没有更优雅的方法来完成以下任务? 基本上,我需要一种简单的方法来编程地构建一个WrapPanel(或其他框架元素): 正确包裹 允许某些单词有粗体文本 允许某些单词具有斜体文本 允许其他格式,例如颜色、背景 理想的方法是将例如“这是粗体,这是斜体文本。”转换为适当的框架元素,以便我可以将其添加到堆栈面板中并显示它 代码: 编辑:我在另一个答案中发现,TextBlock也有一个内联线集合,可以向其中添加Runs。巧妙地使用附加属性作为一种转换器 我认为适合您的是FlowDocumentSc

有没有更优雅的方法来完成以下任务?

基本上,我需要一种简单的方法来编程地构建一个
WrapPanel
(或其他框架元素):

  • 正确包裹
  • 允许某些单词有粗体文本
  • 允许某些单词具有斜体文本
  • 允许其他格式,例如颜色、背景
  • 理想的方法是将例如“
    这是粗体,这是斜体文本。
    ”转换为适当的框架元素,以便我可以将其添加到堆栈面板中并显示它
代码:


编辑:我在另一个答案中发现,
TextBlock
也有一个
内联线
集合,可以向其中添加
Run
s。巧妙地使用附加属性作为一种转换器


我认为适合您的是
FlowDocumentScrollViewer
FlowDocument
。我稍微描述一下通过
IValueConverter
手动创建一个

您可能会使用与示例中所示类似的助手函数,但是
FlowDocument
已经非常类似于HTML,可以轻松地处理包装

段落
s添加到
流程文档
,将
运行
s添加到
段落
,每个
运行
都源自
文本元素
,因此它具有许多与
文本块
相同的属性

FlowDocument doc = new FlowDocument();
Paragraph par = new Paragraph();
doc.Blocks.Add( par );

Run r;
r = new Run( "This is " );
par.Inlines.Add( r );

r = new Run( "bold" );
r.FontWeight = FontWeights.Bold;
par.Inlines.Add( r );

r = new Run( " and this is " );
par.Inlines.Add( r );

r = new Run( "italic" );
r.FontStyle = FontStyles.Italic;
par.Inlines.Add( r );

r = new Run( " text." );
par.Inlines.Add( r );


此外,如果格式化子字符串仍将限于粗体/斜体标记或其他一些非常简单的标记,则使用
Regex.Split()
可能是从单个字符串确定单独的
运行的最简单方法。它允许您将一个字符串拆分为多个字符串,但保留您的“分隔符”。

编辑:我在另一个回答中发现,
TextBlock
也有一个
内联线
集合,可以向其中添加
Run
s。巧妙地使用附加属性作为一种转换器


我认为适合您的是
FlowDocumentScrollViewer
FlowDocument
。我稍微描述一下通过
IValueConverter
手动创建一个

您可能会使用与示例中所示类似的助手函数,但是
FlowDocument
已经非常类似于HTML,可以轻松地处理包装

段落
s添加到
流程文档
,将
运行
s添加到
段落
,每个
运行
都源自
文本元素
,因此它具有许多与
文本块
相同的属性

FlowDocument doc = new FlowDocument();
Paragraph par = new Paragraph();
doc.Blocks.Add( par );

Run r;
r = new Run( "This is " );
par.Inlines.Add( r );

r = new Run( "bold" );
r.FontWeight = FontWeights.Bold;
par.Inlines.Add( r );

r = new Run( " and this is " );
par.Inlines.Add( r );

r = new Run( "italic" );
r.FontStyle = FontStyles.Italic;
par.Inlines.Add( r );

r = new Run( " text." );
par.Inlines.Add( r );

此外,如果格式化子字符串仍将限于粗体/斜体标记或其他一些非常简单的标记,则使用
Regex.Split()
可能是从单个字符串确定单独的
运行的最简单方法。它允许您将一个字符串拆分为多个字符串,但保留“分隔符”