如何在Windows Phone 8.1中添加共享命令栏

时间:2014-12-15 00:58:09

标签: c# windows-phone-8.1

您好我正在制作我的第一个官方Windows Phone 8.1应用程序。我想知道如何在整个应用程序中添加共享命令栏。我一直这样做的方法是将xaml从每个页面复制并粘贴到下一页。我觉得这是非常低效的,我只是不知道该怎么做以及在哪里添加它(如在哪一页)。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

尝试将CommandBar添加到Application的资源中(在App.xaml中)。然后,您只需从每个页面上的资源中设置它:

<Application.Resources>
  <CommandBar x:Key="GlobalCommandBar"/>
</Application.Resources>

<Page
  x:Class="..."
  BottomAppBar={StaticResource GlobalCommandBar}>
</Page>

答案 1 :(得分:0)

我想到了两种方式:

a)首先要像at MSDN这样做 - 基本上你可以扩展 Page 类,并在 OnLoaded ecent中添加应用程序栏。然后将应用中的所有页面更改为扩展页面。

b)其他方法稍微复杂一点(据我记得我在MSDN的某个地方也看到过它)需要更多步骤,但也许会有所帮助:

  • 您需要更改 Window.Current.Content 中的内容 - 在大多数应用中, Frame ,让我们使用我们的常用应用程序栏使其成为 Page ,此页面内容将成为我们的新rootFrame(所有应用程序页面都将放入该框架中)。在这里,我们需要在扩展页面和启动事件的代码下面更改一些 OnLaunched 事件:

    <Page x:Class="Example81.PageWithAppBar"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
          <Frame Name="rootFrame"></Frame>
    
          <Page.BottomAppBar>
             <CommandBar>
               <AppBarButton Icon="Help" Label="Ask"/>
             </CommandBar>
          </Page.BottomAppBar>
    </Page>
    
    // we need to expose the frame
    public sealed partial class PageWithAppBar : Page
    {
        public Frame RootFrame { get { return rootFrame; } }
        // rest ...
    
    // app.xam.cs launched event
    PageWithAppBar rootPage;
    public CommandBar MyAppBar { get { return rootPage.BottomAppBar as CommandBar; } }
    protected override void OnLaunched(LaunchActivatedEventArgs e)
    {
        rootPage = Window.Current.Content as PageWithAppBar;
        if (rootPage == null)
        {
            rootPage = new PageWithAppBar();
    
            rootPage.Language = Windows.Globalization.ApplicationLanguages.Languages[0];
            Window.Current.Content = rootPage;
        }
        if (rootPage.RootFrame.Content == null)
            rootPage.RootFrame.Navigate(typeof(MainPage), e.Arguments);
    
        Window.Current.Activate();
    }
    
  • 我们也不应该忘记其他事情 - 比如按下后退键,我们改变了一点我们的应用程序组织,所以这也会改变:

    private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        Frame frame = rootPage.RootFrame;
        if (frame == null)
            return;
    
        if (frame.CanGoBack)
        {
            frame.GoBack();
            e.Handled = true;
        }
    }
    
  • 然后您可以在其他页面中正常导航,访问我在App类中的属性上方公开的应用栏,您可以像这样使用它:

    ((App.Current as App).MyAppBar.PrimaryCommands[0] as AppBarButton).Label = "New label";
    

第二种方式稍微复杂一些,它还需要一些改进,可能还需要对 NavigationHelper SuspensionManager 进行一些更改。上面代码的工作示例可以find at GitHub