如何在WP 8.1中与多个页面共享BottomAppBar

时间:2014-06-06 09:34:28

标签: xaml winrt-xaml windows-phone-8.1

我的应用有多个页面,我希望所有这些页面都有相同的底部应用栏

以下是我的底部应用栏的代码:

<Page.BottomAppBar>
    <CommandBar ClosedDisplayMode="Minimal" Background="#FF004557">
        <CommandBar.SecondaryCommands>
            <AppBarButton x:Name="AppBar_1" Label="AppBar_1" Click="AppBar_1_Click"/>
            <AppBarButton x:Name="AppBar_2" Label="AppBar_2" Click="AppBar_2_Click" />
            <AppBarButton x:Name="AppBar_3" Label="Appbar_3" Click="AppBar_3_Click" />
            <AppBarButton Label="About" />
        </CommandBar.SecondaryCommands>
    </CommandBar>
</Page.BottomAppBar>

我该怎么做?

3 个答案:

答案 0 :(得分:4)

好。

当您的应用第一次运行时,第一个执行的是App.xaml.cs文件中的OnLaunched方法。它可能看起来像这样:

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame = new Frame();
        Window.Current.Content = rootFrame;
    }
    if (rootFrame.Content == null)
    {
        rootFrame.Navigate(typeof(MainPage), e.Arguments);
    }
    Window.Current.Activate();
}

Windows 8中的导航由导航框架处理,这很像浏览器。如果您将浏览器调用frame而不是获得它。内部有一个框架和页面加载。您可以加载另一个页面,然后返回框架,就像您在浏览器中返回到上一页一样。而且,就像您的浏览器有历史记录一样,您的Windows 8 XAML框架有backstack来完成此任务。你也可以继续前进。

OnLaunched代码会在您的应用中创建第一帧(因为默认情况下没有),并将其设置为Windows.Current.Content,这是所有应用的本机UI容器。具体来说,它是行Window.Current.Content = rootFrame;

从现在开始,您的应用中的页面(包括MainPage)将加载到此新根框架中。这是Windows 8应用程序的典型实现。这会随共享应用栏而变化。共享应用栏未将Window.Current.Content设置为frame,而是将其设置为其中包含框架的根page

这里的目标是根page永远不会改变。导航时,实际上是在frame内导航,它位于根page内。因此,您可以将内容放在根page中,就像appbar一样。此应用栏将在根页面框架中加载的所有页面之间共享。

这是一个聪明的实现。但有一点需要注意。如果您的任何页面本身需要自定义appbar,则需要编写相当多的特殊代码才能将页面的appbar注入共享的appbar。如果你没有这个&#34; custom&#34;要求,那么这是一个简单而有效的解决方案。

选项2

没有理由您无法创建实现UserControlAppBar的{​​{1}},只需在您拥有共享逻辑的页面中包含该CommandBar。如果我的网页中有自定义应用栏的可能性,那可能就是我这样做的方式。

祝你好运!

答案 1 :(得分:2)

使用C ++,C#或Visual Basic的Windows应用商店应用中的每个页面都可以将AppBar分配给其TopAppBar和BottomAppBar属性。但您可能希望在应用程序的相关页面中使用相同的AppBar来提供常见的导航或命令。

这是一个教程How to share an app bar across pages

答案 2 :(得分:0)

您可以将AppBar代码放入App.xaml并将对应代码隐藏到App.xaml.cs中,然后将AppBar的名称包含在您想要的页数中像..

<phone:PhoneApplicationPage
x:Class="PhoneApp1.myPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
.
.
.
.
ApplicationBar="{StaticResource myGlobalAppBar}" >

其中&#34; myGlobalAppBar&#34;是AppBar文件中提供的App.xaml的名称。