xaml - UWP NavigationView 在特定的“全屏”页面上隐藏 NavPane
问题描述
我有非常基本的带框架的 NavigationView:
<NavigationView
x:Name="navigationView"
AlwaysShowHeader="False"
SelectionChanged="{x:Bind ViewModel.OnSelectionChanged}">
<Grid>
<Frame x:Name="shellFrame" />
</Grid>
</NavigationView>
最简单的EventHandler:
public async void OnSelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
var item = args.SelectedItem as NavigationViewItem;
// I'm using Prism framework, by the way...
navigationService.Navigate(item.Tag.ToString(), null);
}
当您导航到“正在播放”时,我希望获得与Groove Music中相同的效果- NavPane 正在隐藏,并且只有 appbackbutton 可用。我当前的解决方案是在我的 FullscreenPage 上捕获 OnNavigatedTo 和 OnNavigatedFrom 事件并更改 NavigationView.CompactPaneLength 和 NavigationView.OpenPaneLength:
public override void OnNavigatedTo(NavigatedToEventArgs e, Dictionary<string, object> viewModelState)
{
// private field
// navigationPage = Window.Current.Content as NavigationPage;
navigationPage.NavigationView.IsPaneToggleButtonVisible = false;
navigationPage.NavigationView.CompactPaneLength = 0;
navigationPage.NavigationView.OpenPaneLength = 0;
}
public override void OnNavigatingFrom(NavigatingFromEventArgs e, Dictionary<string, object> viewModelState, bool suspending)
{
navigationPage.NavigationView.IsPaneToggleButtonVisible = true;
navigationPage.NavigationView.CompactPaneLength = 64;
navigationPage.NavigationView.OpenPaneLength = 320;
}
它按预期工作,但是当 NavigationView“崩溃”时,会有一些敏捷的冻结。也许有更好的解决方案?
解决方案
当您导航到“正在播放”时,我希望获得与 Groove Music 中相同的效果
显示NavigationView
在 MainPage 的框架中,其中包含ContentFrame
用于显示FirstPage
和的内容SecondPage
。如果要显示PlayPage
和隐藏NavigationView
,更好的方法是PlayPage
如下MainPageFrame
图所示。
当您从 回到 时PlayPage
,MainPage
会NavigationView
自动显示,您无需处理复杂的动画NavigationView
。请参考以下代码。
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.NavigationMode == NavigationMode.Back)
{
foreach(NavigationViewItemBase item in NvTest.MenuItems)
{
if((string) item.Tag == contentFrame.CurrentSourcePageType.Name)
{
SelectItem = item;
}
}
}
Windows.UI.Core.SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Collapsed;
base.OnNavigatedTo(e);
}
private NavigationViewItemBase selectItem;
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public NavigationViewItemBase SelectItem
{
get
{
return selectItem;
}
set
{
selectItem = value;
OnPropertyChanged();
}
}
private void NvTest_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
var selectedItem = (NavigationViewItem)args.SelectedItem;
string pageName = "App14." + ((string)selectedItem.Tag);
if ((string)selectedItem.Tag == "PlayPage")
{
this.Frame.Navigate(Type.GetType(pageName));
}
else
{
sender.Header = pageName;
Type pageType = Type.GetType(pageName);
contentFrame.Navigate(pageType);
}
}
主页.xaml
<Grid>
<NavigationView x:Name="NvTest" SelectionChanged="NvTest_SelectionChanged" SelectedItem="{x:Bind SelectItem,Mode=TwoWay}">
<NavigationView.MenuItems>
<NavigationViewItem Icon="Play" Content="Menu Item1" Tag="SamplePage1" />
<NavigationViewItemSeparator/>
<NavigationViewItem Icon="Save" Content="Menu Item2" Tag="PlayPage" />
<NavigationViewItem Icon="Save" Content="Menu Item3" Tag="SamplePage2" />
</NavigationView.MenuItems>
<Frame x:Name="contentFrame"/>
</NavigationView>
</Grid>
这是代码示例。
推荐阅读
- c# - 如何在不调用 IsCancellationRequested 或 ThrowIfCancellationRequested 的情况下取消任务并引发异常
- r - 如何自定义闪亮的绘图函数以根据从调用函数接收的参数输出不同的绘图
- python - 替换类的列表元素
- ios - 反应原生 iOS 网络请求失败 - 代理设置问题
- veins - 我如何定义两辆车在血管中越来越远?
- vba - 在 DoCmd.TransferDatabase 中使用连接字符串变量
- r - 如何在 R 中通过加权平均栅格化点数据?
- rest - Informatica BDM - 如何重试“REST Web 服务使用者”?
- javascript - 如何将逻辑语句引入 XML 视图或如何更改某些 Table 项目的展示方式
- r - Anova not working at multilevel analysis - "$ operator not defined for this S4 class"