2010-10-17 1 views
1

Предположим, у нас есть сетка XAML, как показано ниже - например. сгенерированная строка, возвращаемая методом.Как добавить элемент управления WPF из строки XAML во время выполнения?

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text='id' Grid.Column='0'/> 
    <Rectangle Fill='Black' Grid.Column='1' /> 
</Grid> 

То, что я хочу сделать, это создать такую ​​сетку и добавляют к StackPanel во время выполнения, коды, аналогичные, как показано ниже.

XmlReader xr = XmlReader.Create(input: new StringReader(g.xaml)); 
var control = XamlReader.Load(xr) as Grid; 
this.stackPanel.Children.Add(control); 

Форма я использую:

<Window x:Class='AllRibbonBrushes.MainWindow' 
     xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
     xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' 
     Title='MainWindow' Height='223' Width='533' 
     Loaded='Window_Loaded'> 
    <ScrollViewer> 
     <StackPanel Name="stackPanel"> 
      <!--The runtime grid need to be added here--> 
     </StackPanel> 
    </ScrollViewer> 
</Window> 

Но я получаю ошибку Cannot create unknow type 'Grid'. Я преуспеваю в этом, добавляя кнопку/текстовый блок, но не смог добавить сетку с вложенными элементами управления.

Если вы знаете, как это сделать, пожалуйста, поделитесь. Все приветствуются и очень ценятся!

ответ

4

Добавить xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' в первый элемент Grid в xaml, который вы хотели бы загрузить. Это объявляет пространство имен wpf пространством имен по умолчанию в вашем xaml. Затем XamlReader.Load может узнать, что такое контроль.

<Grid xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text='id' Grid.Column='0'/> 
    <Rectangle Fill='Black' Grid.Column='1' /> 
</Grid>