如何在特定子页面隐藏或移除Shell的ToolbarItems?
解决Shell全局二级ToolbarItem在特定页面隐藏的问题
方法一:通过标记控制可见性(推荐)
给全局定义的ToolbarItem添加统一标识,在目标页面的生命周期方法中切换可见状态,避免永久移除。
步骤1:修改AppShell中的ToolbarItem
给需要全局控制的二级ToolbarItem添加Tag属性,用于区分全局项:
<Shell ... > <Shell.ToolbarItems> <ToolbarItem Text="Test1" Order="Secondary" Priority="0" Tag="GlobalSecondary" /> <ToolbarItem Text="Test2" Order="Secondary" Tag="GlobalSecondary" /> <ToolbarItem Text="Test4" Order="Secondary" Tag="GlobalSecondary" /> </Shell.ToolbarItems> ... </Shell>
步骤2:在目标页面中切换可见性
在需要隐藏全局ToolbarItem的页面,重写生命周期方法,分别处理隐藏和恢复逻辑:
protected override void OnAppearing() { base.OnAppearing(); // 隐藏标记为GlobalSecondary的全局ToolbarItem foreach (var toolbarItem in Shell.Current.ToolbarItems) { if (toolbarItem.Tag?.ToString() == "GlobalSecondary") { toolbarItem.IsVisible = false; } } } protected override void OnDisappearing() { base.OnDisappearing(); // 恢复全局ToolbarItem的可见性 foreach (var toolbarItem in Shell.Current.ToolbarItems) { if (toolbarItem.Tag?.ToString() == "GlobalSecondary") { toolbarItem.IsVisible = true; } } }
方法二:临时移除并恢复ToolbarItem集合
如果不想使用标记,可在页面初始化时保存全局ToolbarItem的副本,页面出现时移除,离开时重新添加:
步骤1:保存全局ToolbarItem副本
private List<ToolbarItem> _globalToolbarItems; public TargetPage() { InitializeComponent(); // 提前复制全局ToolbarItem集合 _globalToolbarItems = Shell.Current.ToolbarItems.ToList(); }
步骤2:在生命周期中切换集合
protected override void OnAppearing() { base.OnAppearing(); // 清空当前Shell的ToolbarItem Shell.Current.ToolbarItems.Clear(); } protected override void OnDisappearing() { base.OnDisappearing(); // 恢复全局ToolbarItem,避免重复添加 foreach (var item in _globalToolbarItems) { if (!Shell.Current.ToolbarItems.Contains(item)) { Shell.Current.ToolbarItems.Add(item); } } }
注意:方法二需注意集合引用问题,恢复时要判断是否已存在,适合不需要区分全局与页面自有ToolbarItem的场景。
内容的提问来源于stack exchange,提问作者ASP
相关产品推荐
相关产品推荐

