如果您将 MainPage 与 ASP.NET 中的 MasterPage 类似地使用,您的 MainPage 应该具有 APP Bar 定义,并且在正文中应该只包含一个单帧元素。
使用这种模式来设置应用程序的内容,而不是
Window.Current.Content = // An Application Page
use
AppFrame.Content = //An Application Page
还请考虑,从 MainPage 元素中删除您的 Mainpage 代码并将其放置在自定义用户控件中,然后您可以从 userControl 为 MainPage 处理一个事件。它还允许您在应用程序的其他位置使用该功能,而无需完全重新创建逻辑和 UI。
这是 MainPage 的示例 XAML:
>
<Page.Resources>
<ResourceDictionary x:Name="CommonStyles" Source="/Common/StandardStyles.xaml" />
</Page.Resources>
<Page.TopAppBar>
<AppBar x:Name="NavigationAppBar" Padding="10,0,10,0" AutomationProperties.Name="Global App Bar" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel x:Name="LeftCommands" Orientation="Horizontal" Grid.Column="0" HorizontalAlignment="Left">
<!-- App Bar Buttons Removed -->
</StackPanel>
</Grid>
</AppBar>
</Page.TopAppBar>
<!--
This grid acts as a root panel for the page that defines two rows:
* Row 0 contains the back button and page title
* Row 1 contains the rest of the page layout
-->
使用 Getter 和 Setter 将 Frame 类型的公共属性添加到应用程序视图模型
public Frame SelectedAppFrame {get;set;}
在 MainPage.xaml.cs 文件中分配一个属性:
ApplicationViewModel vm = this.PageBackgroundGrid.DataContext as ApplicationViewModel;
vm.SelectedAppFrame = this.AppFrame;
在应用程序视图模型中进行通用导航的代码是:
public void HandleNavigaitionEvent(object sender, string pageName, Frame AppFrame, StackPanel stack)
{
var content = Pages.Where(i => i.Name == pageName).FirstOrDefault();
NavigateTrigger(AppFrame, content);
}
public void NavigateTrigger(Frame AppFrame, LayoutAwarePage content)
{
EventAggregator.GetEvent<PageNavigatedEvent>().Publish(content);
AppFrame.Content = content;
NaviagationPath.Add(content);
}
这样,您可以将更改从应用程序中可访问 ApplicationViewModel 的任何位置传播到 AppFram(应该无处不在)。