2016-02-15 4 views
0

Я работаю над WPF-приложением. В этом приложении у меня есть некоторые сегменты XAML. Мне нужно отобразить сегменты XAML в TextBlock. В моем XAML, у меня есть следующие строки:WPF - рендеринг сегмента Xaml

<TextBlock Text="{Binding Path=XamlSegment, Converter={StaticResource XamlToTextConverter}}" /> 

Свойство XamlSegment будет иметь значение как "-0.275 * x2". В попытке сделать этот XAML в моем пользовательском интерфейсе, так что Надстрочные показывает, я использую XamlToTextConverter, который определяется следующим образом:

namespace MyApp.Converters 
{ 
    public class XamlToTextConverter : IValueConverter 
    { 
    private static readonly Regex Regex = new Regex("(<.*?)>(.*)(</.*?>)", RegexOptions.Compiled); 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // value looks like this: -0.275*x<Run Typography.Variants="Superscript">2</Run> 
     var xamlText = value as string; 
     if (xamlText != null) 
     { 
     try 
     { 
      xamlText = "<TextBlock>" + xamlText + "</TextBlock>"; 

      var xamlTextWithNamespace = Regex.Replace(xamlText, "$1 xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">$2$3"); 
      return XamlReader.Parse(xamlTextWithNamespace); 
     } 
     catch (Exception) 
     { 
      return value; 
     } 
     } 
     else 
     { 
     return value; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 
} 

Когда преобразователь получает побежал мой интерфейс показывает «System.Windows. Controls.TextBlock "вместо отображаемого XAML. Но я не знаю, почему. Как мне получить мой XamlSegment для визуализации в моем интерфейсе?

Благодаря

+0

Согласно [этой ссылке] (https://msdn.microsoft.com/en-us/library/cc663033 (v = vs.110) .aspx), метод XamlReader.Parse должен возвращать 'TextBlock' объект. – Colin

+0

@Colin 'XamlReader.Parse' возвращает объект TextBlock. Однако в самом пользовательском интерфейсе его притяжение «System.Windows.Controls.TextBlock» вместо фактического отображения TextBlock. Я не понимаю, почему и как это исправить. – user70192

ответ

0

Текст свойство TextBlock будет установлен на TextBlock объекта в соответствии с вашими XamlToTextConverter. Поскольку свойство Text должно быть типа string, оно не знает, как показать строку TextBlock как строку. Таким образом, способ по умолчанию - использовать метод ToString на TextBlock, чтобы заполнить свойство Text, которое делает значение Text как «System.Windows.Controls.TextBlock». Кажется, что вы хотели бы динамически визуализировать xaml. Вы можете обратиться к этой ссылке (Loading XAML XML through runtime?) для решения.