能否检测NavigationView折叠按钮的点击事件?具体如何实现?
可以检测该事件,WinUI的NavigationView已经提供了成熟的内置处理方案,不需要额外自定义控件或挖取控件模板。
方法1:直接订阅PaneOpening/PaneClosing事件(最简单通用)
折叠按钮点击的本质是触发NavigationView侧边栏(Pane)的展开/收起状态切换,直接订阅这两个内置事件即可捕获操作:
- 首先修改你的XAML代码,添加事件绑定:
<muxc:NavigationView PaneDisplayMode="LeftCompact" IsBackButtonVisible="Collapsed" gaze:GazeInput.Interaction="Disabled" x:Name="Navbar" Grid.ColumnSpan="2" ItemInvoked="Navbar_ItemInvoked" PaneOpening="Navbar_PaneOpening" PaneClosing="Navbar_PaneClosing">
- 然后在后台代码中添加对应的事件处理逻辑:
private void Navbar_PaneOpening(NavigationView sender, object args) { // 折叠按钮被点击、侧边栏即将展开时执行的逻辑 } private void Navbar_PaneClosing(NavigationView sender, NavigationViewPaneClosingEventArgs args) { // 折叠按钮被点击、侧边栏即将收起时执行的逻辑 // 若需要取消本次收起操作,设置 args.Cancel = true 即可 }
方法2:监听IsPaneOpen属性变更(兼容全场景触发的状态变更)
如果你需要同时捕获所有触发侧边栏状态变化的场景(包括后台代码主动修改状态、手势滑动侧边栏等),可以监听IsPaneOpen属性的变更:
- 在页面初始化时注册属性变更监听:
public MainPage() { this.InitializeComponent(); Navbar.RegisterPropertyChangedCallback(NavigationView.IsPaneOpenProperty, OnIsPaneOpenChanged); } private void OnIsPaneOpenChanged(DependencyObject sender, DependencyProperty dp) { bool isNowOpen = Navbar.IsPaneOpen; if (isNowOpen) { // 侧边栏展开时执行的逻辑 } else { // 侧边栏收起时执行的逻辑 } }
注意:以上两种方法都会捕获所有触发侧边栏状态变更的操作,如果你需要严格区分只有用户点击折叠按钮的场景,可以额外给NavigationView模板内的ToggleButton绑定点击事件,但绝大多数业务场景下以上两种方法已经可以满足需求。
内容的提问来源于stack exchange,提问作者CallMeTrebor
相关产品推荐
相关产品推荐

