UWP NavigationView 如何取消 NavigationViewSelectionChangedEventArgs
Posted
技术标签:
【中文标题】UWP NavigationView 如何取消 NavigationViewSelectionChangedEventArgs【英文标题】:UWP NavigationView How To Cancel a NavigationViewSelectionChangedEventArgs 【发布时间】:2018-08-14 14:00:03 【问题描述】:我们设置 NavigationView 的 SelectionChanged 事件来运行一些条件检查。
private void ApplicationNavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
我们只允许用户在满足条件时从页面 A 导航到页面 B。
问题是即使我们可以停止从Page A到Page B的导航,NavigationView
的选择指示符总是从NavigationViewItem
A (Page A) 到NavigationViewItem
B(页面 B)在用户点击/点击时。这是一种误导,因为选择指示器显示 NavigationViewItem
B 已被选中,而页面仍然是页面 A。
有什么方法可以取消 SelectionChanged 事件并停止选择指示器的更改?
尝试以下代码没有成功
private NavigationViewItem previousNavigationViewItemSelected = null;
private async void ApplicationNavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
var selectedItem = (args.SelectedItem) as NavigationViewItem;
if (selectedItem.Tag != null)
string pageName = "NavigationViewTest." + ((string)selectedItem.Tag);
Type pageType = Type.GetType(pageName);
contentFrame.Navigate(pageType);
previousNavigationViewItemSelected = selectedItem;
else
sender.SelectedItem = previousNavigationViewItemSelected;
NavigationViewItem.Tag 包含目标页面。当它不为空时,我们导航到目标页面,并缓存当前的 NavigationViewItem。当它为空时,我们将之前缓存的 NavigationViewItem 设置为 NavigationView.SelectedItem。我们预计这会将 SelectionIndicator 恢复到缓存的 NavigationViewItem,但事实并非如此。 SelectionIndicator 仍然更改为单击的 NavigationViewItem。这里有什么问题吗?
【问题讨论】:
【参考方案1】:我认为使用Visibility
属性隐藏禁用的NavigationViewItems
或使用IsEnabled
属性禁用它们是合适的。当您描述的条件发生变化时,您可以主动更新属性,以便用户根本无法单击选择项目。
否则您无法取消SelectionChanged
事件,那么您唯一能做的就是将NavigationView.SelectedItem
设置为null
或其他项目。
【讨论】:
谢谢你的建议,马丁。问题是我们只有在知道用户点击了哪个 NavigationViewItem 时才能检查条件。所以我们需要保持 IsHitTestVisible、Visibility 和 IsEnabled 为 True 以获取用户点击。一旦用户单击,SelectionIndictor 将移动到新的 NavigationViewItem,并且无法通过 sender.SelectedItem = previousNavigationViewItemSelected 恢复。【参考方案2】:最好的方法是设置 .IsHitTestVisible 或 .IsEnabled 使该项目不可点击。 在您的情况下,您可以重新模板 NavigationViewItem 并自己控制选择指示器。我不建议这样做,因为它仅适用于高级用户,并且不保证它将在未来版本的 Windows 中工作。
-
打开 generic.xaml 并搜索
<Style TargetType="NavigationViewItem">
。您的目录可能看起来不同,具体取决于您的 SDK 版本和 VS 安装位置。
"C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\10.0.16299.0\Generic\generic.xaml"
将样式复制到您的页面和 app.xaml,并删除、重命名或修改 SelectionIndicator(例如:Visibility="Collapsed")。
<Grid
HorizontalAlignment="Left"
VerticalAlignment="Center">
<Rectangle
x:Name="SelectionIndicator"
Width="6"
Height="24"
Fill="ThemeResource NavigationViewSelectionIndicatorForeground"
Opacity="0.0"/>
</Grid>
由于我们破坏了默认的selectinoindicator,我们可能需要创建自己的SelectionIndicator,并创建动画,自己控制它的不透明度/可见性。
注意:
如果您在 Windows Insider OS 上工作并使用新的 SDK,如 10.0.17763.0,您可能会看到 SelectionIndicator 不在<Style TargetType="NavigationViewItem">
中。
您可以从 10.0.16299.0 复制样式,它应该仍然有效。
【讨论】:
以上是关于UWP NavigationView 如何取消 NavigationViewSelectionChangedEventArgs的主要内容,如果未能解决你的问题,请参考以下文章
UWP C# WINUI NavigationView 如何访问其他页面/视图
如何使用UWP NavigationView后退按钮而不重新加载页面
UWP NavigationView 和 TabView 冲突
UWP NavigationView通过MVVM切换到另一个页面