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

NavigationView启动时窗格显示截断 点击汉堡按钮重开后恢复正常

问题描述

应用启动时,NavigationView窗格本应处于默认展开状态,但实际窗格内容出现显示截断,主页、设置等菜单项图标显示不全,只有点击汉堡菜单按钮重新打开窗格后,显示才能恢复正常。手动重置IsPaneOpen等相关属性无法解决该问题。

问题表现(主页、设置菜单项图标被截断):
截断的主页、设置菜单项图标

预期正常显示效果:
预期正常显示效果

相关代码
<Custom:NavigationView x:Name="navigationView" SelectionChanged="NavigationView_SelectionChanged" Grid.Row="1"
                           BackRequested="NavigationView_BackRequested" IsBackEnabled="False" IsBackButtonVisible="Collapsed" PaneDisplayMode="Auto">

完整页面XAML代码

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="32"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid Background="Transparent" x:Name="appTitlebar">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0"/>
                <ColumnDefinition/>
                <ColumnDefinition Width="0"/>
            </Grid.ColumnDefinitions>
            <Image Width="16" Height="16" Grid.Column="1" Margin="8 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Center"/>
            <TextBlock Text="Window Title" Margin="28 0 0 0" VerticalAlignment="Center" Style="{ThemeResource CaptionTextBlockStyle}" Grid.Column="1" />
        </Grid>

        <Custom:NavigationView x:Name="navigationView" SelectionChanged="NavigationView_SelectionChanged" Grid.Row="1"
                           BackRequested="NavigationView_BackRequested" IsBackEnabled="False" IsBackButtonVisible="Collapsed" PaneDisplayMode="Auto">
            <Custom:NavigationView.MenuItems>
                <Custom:NavigationViewItem IsSelected="True" x:Uid="Main_NavMenu_Item_Home" x:Name="menuHome" Icon="Home"/>
            </Custom:NavigationView.MenuItems>
            <Frame x:Name="frameRoot"/>
        </Custom:NavigationView>
    </Grid>
问题原因

该问题是PaneDisplayMode="Auto"模式下的典型初始化时序问题:NavigationView在窗口首次布局完成前就执行了窗格宽度计算,此时自定义标题栏占用的行高、窗口实际渲染尺寸都还没完成最终测量,导致窗格宽度被错误计算为紧凑模式宽度,但显示状态却停留在展开模式,最终出现内容截断。
在构造函数、初始化阶段修改IsPaneOpen属性不会生效,因为此时可视化树还未完成加载,属性变更无法触发重新布局。

修复方案

按优先级从高到低选择以下方案即可解决问题:

  • 如果不需要窗格自动收起/展开的逻辑,直接将PaneDisplayMode属性值改为Left,固定左侧展开模式,跳过Auto模式初始化阶段的宽度判断逻辑,从根源避免计算错误。
  • 如果需要保留Auto模式,在页面的Loaded事件中执行布局刷新操作,此时可视化树已经完全加载,属性变更可以正常触发重排:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
    navigationView.UpdateLayout();
    // 若仅调用UpdateLayout无效,追加以下两行手动切换状态触发布局重算
    navigationView.IsPaneOpen = false;
    navigationView.IsPaneOpen = true;
}
  • 长期优化方案:不要单独在Grid第一行放置自定义标题栏,将标题栏内容整合到NavigationView的Header区域,同时设置IsTitleBarAutoPaddingEnabled="False",调用系统窗口的SetTitleBar方法将NavigationView的标题栏元素指定为系统拖动区域,让NavigationView在初始化时就能拿到正确的布局尺寸,避免后续出现其他布局异常。

内容的提问来源于stack exchange,提问作者craftersmine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:18:24