2014-09-17 2 views
0

У меня есть сетка и вы хотите изменить ее содержание в разных условиях.Как определить содержимое сетки в качестве ресурса?

Так я определил некоторые ресурсы:

<phone:PhoneApplicationPage.Resources> 

    <StackPanel x:Key="MyStackPanel1"> 
     <!--Content--> 
    </StackPanel>  

    <StackPanel x:Key="MyStackPanel2"> 
     <!--Content--> 
    </StackPanel> 

</phone:PhoneApplicationPage.Resources> 

И у меня есть сетка:

<Grid Name="MyGrid"> 

    </Grid> 

Теперь, когда я хочу использовать эти ресурсы в сетке

var myStackPanel = this.Resources["MyStackPanel1"] as StackPanel; 
MyGrid.Children.Add(myStackPanel); 

я получаю эта ошибка:

Element is already the child of another element.

Как изменить содержание MyGrid в разных условиях? Благодарю.

ответ

1

Хороший способ сделать это достаточно использовать Templates

Пример:

<phone:PhoneApplicationPage.Resources> 

    <ControlTemplate x:Key="Template1"> 
    <StackPanel > 
     <!--Content--> 
    </StackPanel> 
    </ControlTemplate> 

    <ControlTemplate x:Key="Template2"> 
    <StackPanel > 
     <!--Content--> 
    </StackPanel> 
    </ControlTemplate> 

</phone:PhoneApplicationPage.Resources> 

И вместо Grid в качестве контейнера используется простой Control:

<Control x:Name="MyControl" /> 

As в результате вы можете легко переключить его содержимое, изменив его шаблон:

var myTemplate = this.Resources["Template1"] as ControlTemplate; 
MyControl.Template = myTemplate; 

В зависимости от ваших потребностей вы можете использовать для этого DataTemplateSelector s для динамического выбора соответствующего шаблона. Если вам нужно больше одного StackPanel внутри, вы можете просто использовать ItemsControl и играть с каждым отдельным шаблоном