NavigationView启动时窗格显示截断 点击汉堡按钮重开后恢复正常
问题描述
应用启动时,NavigationView窗格本应处于默认展开状态,但实际窗格内容出现显示截断,主页、设置等菜单项图标显示不全,只有点击汉堡菜单按钮重新打开窗格后,显示才能恢复正常。手动重置IsPaneOpen等相关属性无法解决该问题。
问题表现(主页、设置菜单项图标被截断):
预期正常显示效果:
相关代码
NavigationView基础XAML配置
<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
相关产品推荐
相关产品推荐

