【问题标题】:UWP NavigationView How To Cancel a NavigationViewSelectionChangedEventArgsUWP NavigationView 如何取消 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。这里有什么问题吗?

【问题讨论】:

    标签: uwp navigationview selectionchanged


    【解决方案1】:

    我认为使用Visibility 属性隐藏禁用的NavigationViewItems 或使用IsEnabled 属性禁用它们是合适的。当您描述的条件发生变化时,您可以主动更新属性,以便用户根本无法单击选择项目。

    否则您无法取消SelectionChanged 事件,那么您唯一能做的就是将NavigationView.SelectedItem 设置为null 或其他项目。

    【讨论】:

    • 谢谢你的建议,马丁。问题是我们只有在知道用户点击了哪个 NavigationViewItem 时才能检查条件。所以我们需要保持 IsHitTestVisible、Visibility 和 IsEnabled 为 True 以获取用户点击。一旦用户单击,SelectionIndictor 将移动到新的 NavigationViewItem,并且无法通过 sender.SelectedItem = previousNavigationViewItemSelected 恢复。
    【解决方案2】:

    最好的方法是设置 .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 上工作并使用新的 SDK,如 10.0.17763.0,您可能会看到 SelectionIndicator 不在&lt;Style TargetType="NavigationViewItem"&gt; 中。 您可以从 10.0.16299.0 复制样式,它应该仍然有效。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2018-08-09
      • 1970-01-01
      • 2022-01-22
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多