有更优雅的方式来执行以下操作吗?
基本上我需要一种简单的方法来以编程方式构建一个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);
}
}
}
答案 0 :(得分:4)
修改:我在另一个答案中发现,TextBlock
还有一个Inlines
集合,可以添加Run
个。 Anvaka's answer巧妙地使用附属属性作为一种转换器。
我认为适合您的情况的是FlowDocumentScrollViewer
和FlowDocument
。我描述了通过IValueConverter
一点here手动创建一个。{/ p>
您可能会使用与示例中显示的类似的辅助函数,但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
的最简单方法。单弦。它允许您将字符串拆分为多个字符串,但保留“分隔符”。