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 不在&lt;Style TargetType="NavigationViewItem"&gt; 中。 您可以从 10.0.16299.0 复制样式,它应该仍然有效。

【讨论】:

以上是关于UWP NavigationView 如何取消 NavigationViewSelectionChangedEventArgs的主要内容,如果未能解决你的问题,请参考以下文章

UWP C# WINUI NavigationView 如何访问其他页面/视图

如何使用UWP NavigationView后退按钮而不重新加载页面

UWP NavigationView 和 TabView 冲突

UWP NavigationView通过MVVM切换到另一个页面

UWP 设置 NavigationView TogglePaneButton 颜色

UWP 2018 新版 NavigationView 尝鲜