UWP NavigationView如何取消NavigationViewSelectionChangedEventArgs

时间:2018-03-06 16:17:41

标签: uwp navigationview selectionchanged

我们设置NavigationView的SelectionChanged事件以运行一些条件检查。

private void ApplicationNavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{

}

我们只允许用户在满足条件时从页面A导航到页面B.

问题是即使我们可以停止从 Page A 导航到Page B NavigationView的选择指标始终会从{{1}更改用户点击/点按时A(页面A)到NavigationViewItem B(页面B)。这是误导性的,因为选择指示符显示选择了NavigationViewItem B,而页面仍然是页面A.

有没有办法取消SelectionChanged事件并停止选择指标更改?

尝试使用以下代码但未成功

NavigationViewItem

NavigationViewItem.Tag包含目标页面。当它为非null时,我们导航到目标页面,并缓存当前的NavigationViewItem。如果它为null,我们将先前缓存的NavigationViewItem设置为NavigationView.SelectedItem。我们希望这会将SelectionIndicator恢复到缓存的NavigationViewItem,但它没有。 SelectionIndicator仍然更改为单击的NavigationViewItem。这有什么不对吗?

2 个答案:

答案 0 :(得分:0)

我认为使用other()属性隐藏已禁用的NavigationViewItems或使用Visibility属性来禁用它们是合适的。当您描述的条件主动更改时,您可以更新属性,以便用户无法单击选择该项。

否则您无法取消IsEnabled事件,您唯一可以做的就是将SelectionChanged设置为NavigationView.SelectedItem或另一项。

答案 1 :(得分:0)

最好的方法是设置.IsHitTestVisible或.IsEnabled以使该项目不可单击。 根据您的情况,您可以重新设计NavigationViewItem并自己控制选择指示器。我不建议这样做,因为它仅适用于高级用户,也不保证它将在将来的Windows版本中运行。

  1. 打开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”
  2. 将样式复制到页面和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>
    
  3. 由于我们破坏了默认的selectinoindicator,因此我们可能需要创建自己的SelectionIndicator,并创建动画,自己控制其不透明度/可见性。

注意: 如果您使用的是Windows Insider OS,并且使用的是10.0.17763.0之类的新SDK,则可能会看到SelectionIndicator不在<Style TargetType="NavigationViewItem">中。 您可以从10.0.16299.0复制样式,它仍然可以使用。