Silverlight форматирование текста из источника XML - PullRequest
1 голос
/ 29 сентября 2010

У меня есть большая часть информации, относящейся к клиенту, которую я храню в файле XML.

Каждый элемент XML требует своего рода форматированного текста (жирный, курсив, новая строка, абзацы и т. Д.). У меня есть полный контроль над XML-файлом (т. Е. Я могу обернуть текст в другие XML-элементы при необходимости), и он статичен (что немного облегчает жизнь).

Как можно сохранить информацию в файле XML, чтобы я мог загрузить ее на свою страницу Silverlight с правильным форматированием?

Например:

У меня есть такая строка:

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 Ответ

1 голос
/ 29 сентября 2010

Для синтаксического анализатора 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. Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...