2014-11-17 11 views
1

У меня есть проблема, что я хотел бы отобразить содержимое переменной (на основе ссылки «выражение» Metatag.Configuration [VisualizerCode] .Value »в коде ниже). Переменная содержит XAML код (в виде строки), например, следующее содержание:XAML - Оказание содержимого переменной

<Grid> 
<Canvas> 
    <Border Canvas.Top="0" Canvas.Left="390" Width="50" Height="100" BorderThickness="2" BorderBrush="Black"> </Border> 
    <Border Canvas.Top="100" Canvas.Left="340" Width="100" Height="50" BorderThickness="2" BorderBrush="Black"> </Border> 
</Canvas> 
</Grid> 

В моем приложении у меня есть сетки, в которой я хотел бы, чтобы сделать содержимое переменной:

<Grid Margin="0,10,0,0" Visibility="Visible"> 
    <ContentControl Content="{Binding Path=Metatag.Configuration[VisualizerCode].Value}"> 
</ContentControl> 

К сожалению, если я запустил это, строка (= неинтерпретированное содержимое переменной) будет напечатана как текст в Grid вместо интерпретации (в этом случае должны быть нарисованы две красивые, простые границы).

Как я могу заставить XAML интерпретировать содержимое переменной и отображать ее?

Спасибо!

Woelund

+0

Возможный дубликат [Загрузка XAML во время выполнения?] (Http://stackoverflow.com/questions/910814/loading-xaml-at-runtime) –

ответ

1

Вы можете попробовать использовать некоторые пользовательские Converter для преобразования (разобрана) строки в какой-то экземпляр Grid:

public class StringToElementConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, 
             CultureInfo culture){ 
     var pc = new ParserContext(); 
     pc.XmlnsDictionary[""] = 
        "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
     pc.XmlnsDictionary["x"] = "http://schemas.microsoft.com/winfx/2006/xaml"; 
     return XamlReader.Parse(System.Convert.ToString(value), pc); 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, 
              CultureInfo culture){ 
     throw new NotImplementedException(); 
    } 
} 

Объявите конвертер в качестве некоторого ресурса и используется для связывания в XAML код:

<Window.Resources> 
    <local:StringToElementConverter x:Key="elementConverter"/> 
</Window.Resources> 

<ContentControl Content="{Binding Metatag.Configuration[VisualizerCode].Value, 
          Converter={StaticResource elementConverter}}"/> 

Я надеюсь, что вы знаете, как объявить префикс local, представляющий местную NAM espace, в котором объявлен класс конвертера.

+1

Невероятно ... Я официально впечатлен! Большое спасибо - работает как шарм! – Woelund

+0

Вы можете просто использовать 'XamlReader.Parse' вместо создания' ParserContext' и определить свои собственные пространства имен, включая пространства имен по умолчанию. –

+0

@lll Я столкнулся с 'XamlReader.Parse', не используя' ParserContext' I должны включать 'xmlns' *** прямо внутри строки ***, например, такую ​​как' ' ... «'. Вы можете попробовать простую демонстрацию самостоятельно. –

Смежные вопросы