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