代码之家  ›  专栏  ›  技术社区  ›  Mark

Silverlight格式化XML源中的文本

  •  1
  • Mark  · 技术社区  · 14 年前

    我将大量与客户相关的信息存储在XML文件中。

    每个XML元素都需要某种富文本格式(粗体、斜体、换行、段落等)。我可以完全控制XML文件(也就是说,如果需要的话,我可以将文本包装在其他XML元素中),而且它是静态的(这让生活变得更简单)。

    例如:

    我有这样一根弦:

    var str = @"<Run Foreground=""Maroon"" FontFamily=""Courier New"" FontSize=""24"">Courier New 24</Run>";
    

    我不能这么做:

    MyTextBlock.Text = str;
    

    因为它在定义字符串时按字面意思打印(无格式)

    但是,在XAML中,我可以这样定义TextBlock:

    <TextBlock x:Name="PageDetailsTextBlock">
        <Run Foreground="Maroon" FontFamily="Courier New" FontSize="24">Courier New 24</Run>
    </TextBlock>
    

    XAML解析器将把它转换成正确格式的版本。

    如何在C#中执行此操作?

    1 回复  |  直到 14 年前
        1
  •  1
  •   iCollect.it Ltd    14 年前

    Xaml解析器需要一个父对象和一个Xaml名称空间,但我为TextBlocks创建了一个扩展方法来为您完成这项工作:

    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Markup;
    
    namespace SilverlightApplication1
    {
        static public class TextBlockExtensions
        {
            static public void SetInline(this TextBlock textBlock, string text)
            {
                var str = @"<TextBlock xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">" + text + "</TextBlock>";
                TextBlock txt = (TextBlock)XamlReader.Load(str);
                List<Inline> inlines = txt.Inlines.ToList();
                txt.Inlines.Clear();
                foreach (var inline in inlines)
                {
                    textBlock.Inlines.Add(inline);
                }
            }
        }
    }
    

    MyTextBlock.SetInline(str);

    我对它进行了测试,对于任何正常的Xaml文本运行都可以正常工作。好好享受。