构建具有粗体和斜体标记文本的FrameworkElement的最简单方法是什么?

时间:2010-02-17 13:23:48

标签: c# wpf xaml bold italic

有更优雅的方式来执行以下操作吗?

基本上我需要一种简单的方法来以编程方式构建一个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);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

修改:我在另一个答案中发现,TextBlock还有一个Inlines集合,可以添加Run个。 Anvaka's answer巧妙地使用附属属性作为一种转换器。


我认为适合您的情况的是FlowDocumentScrollViewerFlowDocument。我描述了通过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的最简单方法。单弦。它允许您将字符串拆分为多个字符串,但保留“分隔符”。