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

StackOverflow https://stackoverflow.com/questions/2280924

  •  21-09-2019
  •  | 
  •  

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

基本上我需要一个简单的方法 以编程方式 建个 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 可以添加的集合 Runs。 安瓦卡的回答 巧妙地使用附加属性作为一种转换器。


我认为适合你的情况的是 FlowDocumentScrollViewer 和一个 FlowDocument. 。我描述了通过 IValueConverter 一点点 这里.

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

你添加 ParagraphFlowDocument, ,你添加 RunParagraph, ,以及每个 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() 可能是确定单独的最简单的方法 Runs 来自单个字符串。它允许您将一个字符串拆分为多个字符串,但保留“分隔符”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top