添加NavigationViewItem后导航选中仍触发默认添加动画的问题
我之前也碰到过这个情况——动态添加NavigationViewItem并立刻选中导航后,添加项的默认动画还是会播放,确实有点影响体验。问题的根源在于NavigationView默认给菜单项容器配置了AddDeleteThemeTransition,只要有新项加入菜单集合,这个动画就会被触发,哪怕你紧接着选中了该项。
下面是两种实用的解决思路:
方法1:全局移除添加/删除过渡动画
如果你整个NavigationView都不需要菜单项添加或删除时的动画,可以直接在XAML里清空或修改ItemContainerTransitions:
<NavigationView x:Name="NavView"> <NavigationView.ItemContainerTransitions> <TransitionCollection> <!-- 这里可以保留你需要的其他动画,比如PointerOverThemeTransition等,只移除AddDelete相关 --> </TransitionCollection> </NavigationView.ItemContainerTransitions> </NavigationView>
或者在代码里动态移除指定的过渡动画:
// 找到并移除默认的添加删除过渡动画 var addDeleteTransition = NavView.ItemContainerTransitions .OfType<AddDeleteThemeTransition>() .FirstOrDefault(); if (addDeleteTransition != null) { NavView.ItemContainerTransitions.Remove(addDeleteTransition); }
这种方法一劳永逸,适合不需要这类动画的场景,但会影响所有菜单项的添加/删除操作。
方法2:临时禁用动画,添加完成后恢复
如果只是不想让这次动态添加的项触发动画,其他时候的添加/删除动画还要保留,可以临时移除过渡动画,操作完成后再恢复:
// 保存原有的过渡动画集合 var originalTransitions = new TransitionCollection(); foreach (var transition in NavView.ItemContainerTransitions) { originalTransitions.Add(transition); } // 临时清空过渡动画,避免添加新项时触发动画 NavView.ItemContainerTransitions.Clear(); // 添加新的NavigationViewItem NavigationViewItem item = new NavigationViewItem() {/* 你的项配置 */}; NavView.MenuItems.Add(item); // 恢复原有的过渡动画 NavView.ItemContainerTransitions = originalTransitions; // 执行导航和选中操作 ContentFrame.Navigate(typeof(Project), item); var menuItem = NavView.MenuItems .OfType<NavigationViewItem>() .Where(i => i.Tag.ToString() == tag) .First(); NavView.SelectedItem = menuItem;
这种方法更灵活,只会影响当前这次添加操作,不会改变全局的动画行为。
内容的提问来源于stack exchange,提问作者JonasT
相关产品推荐
相关产品推荐

