构建具有粗体和斜体标记文本的 FrameworkElement 最简单的方法是什么?
题
有没有更优雅的方法来执行以下操作?
基本上我需要一个简单的方法 以编程方式 建个 WrapPanel
(或其他 FrameworkElement):
- 包裹 正确地
- 允许某些词有 大胆的 文本
- 允许某些词有 斜体 文本
- 允许其他 格式化, ,例如颜色、背景
- 理想的方法是转换例如”
This is <b>bold</b> and this is <i>italic</i> text.
” 到适当的 FrameworkElement 中,这样我就可以 将其添加到 StackPanel 并显示它。
代码:
using System.Windows;
using System.Windows.Controls;
namespace TestAddTextBlock2343
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
WrapPanel wp = new WrapPanel();
wp.AddTextBlock("This is a sentence with ");
{
TextBlock tb = wp.AddTextBlockAndReturn("bold text");
tb.FontWeight = FontWeights.Bold;
}
wp.AddTextBlock(" and ");
{
TextBlock tb = wp.AddTextBlockAndReturn("italic text");
tb.FontStyle = FontStyles.Italic;
}
wp.AddTextBlock(" in it.");
}
}
public static class XamlHelpers
{
public static TextBlock AddTextBlockAndReturn(this WrapPanel wp, string text)
{
TextBlock tb = new TextBlock();
tb.Text = text;
wp.Children.Add(tb);
return tb;
}
public static void AddTextBlock(this WrapPanel wp, string text)
{
TextBlock tb = wp.AddTextBlockAndReturn(text);
}
}
}
解决方案
编辑:我在另一个答案中发现 TextBlock
还有一个 Inlines
可以添加的集合 Run
s。 安瓦卡的回答 巧妙地使用附加属性作为一种转换器。
我认为适合你的情况的是 FlowDocumentScrollViewer
和一个 FlowDocument
. 。我描述了通过 IValueConverter
一点点 这里.
您可能会使用与示例中所示类似的辅助函数,但是 FlowDocument
已经很像 HTML 并且可以轻松处理换行。
你添加 Paragraph
到 FlowDocument
, ,你添加 Run
到 Paragraph
, ,以及每个 Run
源自于 TextElement
所以它有很多相同的属性 TextBlock
是的。
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()
可能是确定单独的最简单的方法 Run
s 来自单个字符串。它允许您将一个字符串拆分为多个字符串,但保留“分隔符”。
不隶属于 StackOverflow