UWP应用中DynamicOverflowItemsChanging事件结束通知及触发时机问题咨询
解决UWP CommandBar DynamicOverflowItemsChanging事件后获取最终状态的问题
嘿,我完全懂你碰到的这个坑——DynamicOverflowItemsChanging事件确实是在溢出项正在变更的时候触发的,这时候CommandBar的SecondaryCommands还没完成实际的添加/移除操作,所以你拿到的还是旧的菜单状态,同步MoreButton可见性自然就不准了。
给你两个实用的解决方案,都能帮你等到溢出项变更完成后再执行操作:
方案一:用Dispatcher延迟执行操作
利用UI线程的消息队列特性,把你的同步逻辑放到事件处理完成后的队列里执行。代码大概是这样:
private void CommandBar_DynamicOverflowItemsChanging(CommandBar sender, DynamicOverflowItemsChangingEventArgs args) { // 把操作调度到当前事件处理完成后执行 _ = sender.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { // 这里就能拿到更新后的溢出菜单状态了 bool hasOverflowItems = sender.SecondaryCommands.Count > 0; // 同步MoreButton的可见性 sender.IsOverflowButtonVisible = hasOverflowItems; }); }
原理很简单:DynamicOverflowItemsChanging的处理逻辑会先占据UI线程,Dispatcher的异步任务会排在它后面,等事件处理完、CommandBar更新完SecondaryCommands后,才会执行你的同步代码,这时候拿到的就是最新状态了。
方案二:监听SecondaryCommands的集合变化
因为CommandBar的SecondaryCommands是ObservableCollection,你可以直接订阅它的CollectionChanged事件,这个事件是在集合完成变更后触发的,时机更精准:
// 在页面加载/CommandBar初始化时订阅事件 protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); MyCommandBar.SecondaryCommands.CollectionChanged += SecondaryCommands_CollectionChanged; } // 在页面卸载时取消订阅,避免内存泄漏 protected override void OnNavigatedFrom(NavigationEventArgs e) { base.OnNavigatedFrom(e); MyCommandBar.SecondaryCommands.CollectionChanged -= SecondaryCommands_CollectionChanged; } private void SecondaryCommands_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { // 每次溢出项变更完成后都会触发这里 bool hasOverflowItems = MyCommandBar.SecondaryCommands.Count > 0; MyCommandBar.IsOverflowButtonVisible = hasOverflowItems; }
这个方案适合需要频繁处理溢出项变化的场景,而且不需要依赖DynamicOverflowItemsChanging事件本身。
两种方案都能解决你的问题,根据你的场景选就行——如果只是简单同步可见性,方案一足够轻便;如果需要更精细的集合变更处理,方案二更合适。
内容的提问来源于stack exchange,提问作者Muhammad Touseef
相关产品推荐
相关产品推荐

