Xaml 无法以编程方式加载appbar

Xaml 无法以编程方式加载appbar,xaml,microsoft-metro,winrt-xaml,Xaml,Microsoft Metro,Winrt Xaml,当我将appbar作为资源对象附加到页面时,无法获取要显示的appbar 以下代码无法生成工作appbar: app.xaml <AppBar x:Key="RegisterHome_TopAppBar" > <AppBar.Content> <Grid> <StackPanel Orientation="Horizontal" HorizontalAlignment="Ce

当我将appbar作为资源对象附加到页面时,无法获取要显示的appbar

以下代码无法生成工作appbar:

app.xaml

    <AppBar x:Key="RegisterHome_TopAppBar" >
        <AppBar.Content>
            <Grid>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <Button x:Name="RegisterHome_MaterialsButton" />
                    <Button x:Name="RegisterHome_ServicesButton"  />
                </StackPanel>
            </Grid>
        </AppBar.Content>
    </AppBar>
注意: 当我使用此代码时,它工作正常:

            var appbar = new AppBar();
            StackPanel sp = new StackPanel();
            sp.Orientation = Orientation.Horizontal;
            Button myButton = new Button();
            myButton.Content = "Click Me";
            sp.Children.Add(myButton);
            appbar.Content = sp;

            view.TopAppBar = appbar;

一般来说,将UI元素声明为资源是个坏主意。当您这样做时,您不会在每次访问它并在不同地点使用它时都得到一个新实例。在本例中,整个应用程序只有一个实例。UI元素不能有多个父元素,但如果您在同一控件的两个位置甚至两个实例中使用该资源,则违反了该规则

相反,您应该使用模板作为资源,这将生成同一UI的新副本,并在使用模板的任何地方注入它们。在这种情况下,您可以将
Content
标记中的所有内容放入
DataTemplate
中,然后获取该资源并将其分配给新的
AppBar
实例的
ContentTemplate
属性。这样,您每次都会得到一个单独的实例,但子对象和布局是相同的

            var appbar = new AppBar();
            StackPanel sp = new StackPanel();
            sp.Orientation = Orientation.Horizontal;
            Button myButton = new Button();
            myButton.Content = "Click Me";
            sp.Children.Add(myButton);
            appbar.Content = sp;

            view.TopAppBar = appbar;