You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加NavigationViewItem后导航选中仍触发默认添加动画的问题

解决NavigationView动态添加项后默认添加动画仍执行的问题

我之前也碰到过这个情况——动态添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:49