无法以编程方式加载appbar

时间:2013-02-13 03:42:56

标签: xaml microsoft-metro winrt-xaml

当我将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 view = flipView.SelectedItem as Register.Home;

        AppBar appbar = Application.Current.Resources["RegisterHome_TopAppBar"] as AppBar;

        view.TopAppBar = 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;

1 个答案:

答案 0 :(得分:1)

将UI元素声明为资源通常是一个坏主意。当您这样做时,每次访问它时都不会获得新实例并在不同位置使用它。在这种情况下,您将获得一个单个实例,用于整个应用程序。 UI元素不能有多个父元素,但是如果您在两个地方使用该资源,或者甚至是同一控件的两个实例,那么您就违反了它。

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