2010-03-06 2 views
1

Я пытаюсь заменить содержимое элемента управления сеткой WPF другой сеткой WPF, определенной во втором файле XAML в коде (C#).Заменить содержимое Управление сеткой WPF сеткой в ​​другом файле XAML

(упрощенный пример) Window1.xaml:

<Window x:Class="Demo1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<DockPanel> 
    <Menu DockPanel.Dock="Top"> 
     <MenuItem Header="_Set Grid" Click="MenuItem_Click" /> 
    </Menu> 
    <StatusBar DockPanel.Dock="Bottom"> 
     <StatusBarItem Name="statusItem">Status</StatusBarItem> 
    </StatusBar> 
    <Grid Name="header" DockPanel.Dock="Top"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <TextBlock Name="txtHi" Grid.Row="0" Grid.Column="0">Hi</TextBlock> 
     <TextBlock Name="txtName" Grid.Row="0" Grid.Column="1">X</TextBlock> 
    </Grid> 
    <Grid Name="gridContent"> 

    </Grid> 
</DockPanel> 

Windows2.xaml содержит сетку, которая заменяет gridContent

<Window x:Class="Demo1.Window2" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window2" Height="300" Width="300"> 
<Grid Name="grid2"> 
    <Grid.RowDefinitions> 
    <RowDefinition /> 
    <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Label Grid.Column="1" Grid.Row="1">Hello !!!</Label> 
</Grid> 

Событие MenuItem_Click в коде за Windows1.xaml.cs содержит:

private void MenuItem_Click(object sender, RoutedEventArgs e) 
    { 
     Window2 win2 = new Window2(); 
     gridContent = win2.grid2; 
     setStatus(); 
    } 

    private void setStatus() { 
     statusItem.Content = "gridContent has " + gridContent.RowDefinitions.Count + " rows and " + gridContent.ColumnDefinitions.Count + " columns."; 
    } 

Хотя statusItem говорят gridContent содержит 2 строки и 2 столбца после щелчка по меню, окно не изменяется и не содержит текст Hello !!!

Любые идеи, что я делаю неправильно? Если есть лучшие решения для «встраивания» сетки из второго файла xaml, пожалуйста, дайте мне знать.

Спасибо, Робби

ответ

8

Замена значение переменной gridContent не может иметь эффект на дереве элементов управления. Вы должны сначала отключить СЕТКА2 от своих родителей, а затем добавить его к детям gridContent, как это:

win2.Content = null; 
gridContent.Children.Add(win2.grid2); 

Это работает (я пробовал), но это не рекомендуемый способ создания окна , извлеките его содержимое и поместите его в другое окно. Вы должны использовать UserControl вместо Window2, а затем вы можете установить его прямо внутри gridContent.

+0

Это к сожалению возвращает exec: «Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его». – Robbie

+0

Правильно, логично, извините. Я обновил ответ. – Timores

+0

Это сделало трюк, но я буду следовать вашим советам и использовать UserControl. Thx – Robbie

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