UWP XAML:NavigationView样式修改——Minimal模式AlwaysShowHeader设置无效
嘿,我来帮你搞定这个问题!当NavigationView处于Minimal模式时,直接设置AlwaysShowHeader="False"没效果是因为它的默认控件模板里,Minimal对应的VisualState会强制把HeaderPresenter的AlwaysShowHeader设为True,你的设置被模板里的规则覆盖了。下面给你两种靠谱的解决办法:
方法一:修改ControlTemplate(推荐)
这是最优雅的方式,直接调整模板里的VisualState设置:
- 获取默认模板:
- 在Visual Studio里选中你的
NavigationView控件,右键→编辑模板→编辑副本,选择模板保存的位置后,VS会自动生成完整的默认模板代码。
- 在Visual Studio里选中你的
- 修改VisualState:
在生成的模板代码里,找到名为Minimal的VisualState,把里面设置HeaderPresenter.AlwaysShowHeader的那一行删掉或者注释掉:
<VisualState x:Name="Minimal"> <VisualState.Setters> <!-- 删掉这行:<Setter Target="HeaderPresenter.AlwaysShowHeader" Value="True"/> --> <!-- 其他原有Setter保留不变 --> </VisualState.Setters> </VisualState>
- 完成后,你再在
NavigationView标签上设置AlwaysShowHeader="False",就能正常生效了。
方法二:后台代码动态修改
如果不想动模板,也可以在控件加载后通过代码找到HeaderPresenter并修改属性:
首先实现一个查找子控件的辅助方法(借助VisualTreeHelper):
private T FindDescendant<T>(DependencyObject obj) where T : DependencyObject { if (obj is T) return obj as T; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { var child = VisualTreeHelper.GetChild(obj, i); var result = FindDescendant<T>(child); if (result != null) return result; } return null; }
然后给NavigationView绑定Loaded事件,在事件里修改属性:
private void MyNavigationMenu_Loaded(object sender, RoutedEventArgs e) { var headerPresenter = FindDescendant<NavigationViewHeaderPresenter>(MyNavigationMenu); if (headerPresenter != null) { headerPresenter.AlwaysShowHeader = false; } }
别忘了在XAML里给NavigationView加上事件绑定:
<NavigationView x:Name="MyNavigationMenu" AlwaysShowHeader="False" Loaded="MyNavigationMenu_Loaded"> <!-- 你的控件内容 --> </NavigationView>
内容的提问来源于stack exchange,提问作者J.Carden
相关产品推荐
相关产品推荐

