如何在ModernUI WPF应用程序中嵌套ModernMenu控件?
我之前在开发ModernUI的WPF应用时,也踩过这个嵌套ModernMenu的坑,给你几个实用的排查和解决方向:
1. 确保子菜单关联正确的导航服务
主窗口的ModernMenu能正常工作,是因为它默认和ModernWindow的NavigationService绑定了导航上下文,但子页面(SourcePage1)里的ModernMenu并没有自动继承这个上下文。你可以手动在XAML里绑定到窗口的导航服务:
<mui:ModernMenu x:Name="SubModernMenu" NavigationService="{Binding RelativeSource={RelativeSource AncestorType={x:Type mui:ModernWindow}}, Path=NavigationService}" />
这样子菜单就能获取到正确的导航上下文,点击链接时才能正常跳转。
2. 检查源内容的URI路径与绑定逻辑
如果是静态定义菜单链接,要确保Source的URI路径是正确的(注意相对路径的斜杠格式):
<mui:ModernMenu.Links> <mui:Link DisplayName="二级页面1" Source="/Views/SubPage1.xaml" /> <mui:Link DisplayName="二级页面2" Source="/Views/SubPage2.xaml" /> </mui:ModernMenu.Links>
如果是MVVM绑定方式,要确认子页面的ViewModel里的数据源(比如ObservableCollection<Link>)已经正确初始化,并且绑定路径没有错误:
<mui:ModernMenu Links="{Binding SubMenuLinks}" />
3. 避免不必要的嵌套,用原生二级菜单替代
其实ModernUI的Link本身支持SubLinks属性,完全可以在主菜单里直接定义二级导航,不需要在子页面里再嵌套一个ModernMenu,这样更符合框架的设计逻辑,也能避免上下文冲突:
<!-- 主窗口的ModernMenu --> <mui:ModernMenu.Links> <mui:Link DisplayName="主页面1" Source="/Views/SourcePage1.xaml"> <mui:Link.SubLinks> <mui:Link DisplayName="二级子页面1" Source="/Views/SubPage1.xaml" /> <mui:Link DisplayName="二级子页面2" Source="/Views/SubPage2.xaml" /> </mui:Link.SubLinks> </mui:Link> </mui:ModernMenu.Links>
4. 后台代码赋值时机要正确
如果是在后台代码里给子菜单添加链接,要确保在页面加载完成后再操作,比如在Loaded事件里初始化:
private void SourcePage1_Loaded(object sender, RoutedEventArgs e) { var subLinks = new ObservableCollection<Link> { new Link { DisplayName = "动态二级页面", Source = new Uri("/Views/DynamicSubPage.xaml", UriKind.Relative) } }; SubModernMenu.Links = subLinks; }
内容的提问来源于stack exchange,提问作者LKeene
相关产品推荐
相关产品推荐

