0

有没有更优雅的方法来执行以下操作?

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

1 回答 1

4

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


我认为适合您情况的是 aFlowDocumentScrollViewer和 a FlowDocument我在这里IValueConverter稍微介绍一下手动创建一个。

您可能会使用与示例中所示类似的辅助函数,但FlowDocument它已经很像 HTML,并且可以轻松处理包装。

您将Paragraphs 添加到FlowDocument,将Runs 添加到Paragraph,并且每个都Run派生自,TextElement因此它具有许多与TextBlocks 相同的属性。

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 );

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

于 2010-02-17T21:11:52.883 回答