如何将网格内容定义为资源?

时间:2014-09-17 10:21:16

标签: c# wpf xaml windows-phone-8 windows-phone

我有一个网格,想要在不同条件下更改其内容。

所以我定义了一些资源:

<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);

我收到此错误:

  

元素已经是另一个元素的子元素。

如何在不同条件下更改MyGrid的内容?感谢。

1 个答案:

答案 0 :(得分: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" />

因此,您可以通过更改其模板轻松切换其内容:

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

根据您的需要,您可以使用DataTemplateSelector来动态选择适当的模板。如果您需要内置多个StackPanel,则可以使用ItemsControl并使用每个单独的模板