Xamarin.Forms TabbedPage工具栏按钮使用两次后消失问题
Xamarin.Forms TabbedPage 工具栏按钮点击两次后消失问题排查方案
你贴的XAML没有基础语法错误,这个问题是Xamarin.Forms TabbedPage场景的老坑,按以下优先级排查基本都能解决:
- 导航返回时ToolbarItems集合被误清空
先翻TabbedAppPage.xaml.cs的后台代码,查有没有重写OnAppearing、OnDisappearing这两个生命周期方法,有没有对ToolbarItems集合做Clear()、Remove()操作。十有八九是你把工具栏初始化逻辑写在了OnAppearing里,没做首次加载判断,第二次从新增页面导航回来的时候,直接把原有的工具栏项全清了。
修复方式:工具栏初始化逻辑只放在页面构造函数里执行一次,别丢到生命周期方法里重复跑。 - 绑定的Command的CanExecute状态异常
你绑定的NavigateToAddPageCommand如果是RelayCommand或者Command类型,去查它的CanExecute判断逻辑——Xamarin.Forms安卓端旧渲染器有个很反直觉的特性:ToolbarItem绑定的Command如果CanExecute返回false,它不会把按钮置灰,是直接把按钮从视觉树里删掉。要是两次点击之后CanExecute莫名其妙返回false,按钮就直接没了。
修复方式:Command执行完导航逻辑之后,手动调ChangeCanExecute()刷新状态,把CanExecute的判断逻辑捋顺,别无缘无故返回false。 - 子页面工具栏项抢占父级集合
你加的NextPage、ServiceView两个子页面,要是自己也定义了ToolbarItems,在Xamarin.Forms 4.x及更早版本里有已知bug:切子页面+导航返回的组合操作下,子页面的工具栏项会把父TabbedPage的工具栏集覆盖掉,切回来的时候也不会自动还原。
修复方式:要么把工具栏项全下放到每个子页面里单独定义,要么给TabbedPage加个CurrentPageChanged事件监听,每次切页的时候查一下父级工具栏项还在不在,丢了就重新加上。
你现在的XAML可以先做个小调整,把纯展示的那个按钮设为不可点击,排除无交互控件的干扰:
<?xml version="1.0" encoding="utf-8" ?> <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:pages="clr-namespace:ODDJOBS.Views" x:Class="ODDJOBS.Views.TabbedAppPage"> <TabbedPage.ToolbarItems> <ToolbarItem Text="ODDJOBS" Priority="1" IsEnabled="False"/> <ToolbarItem Text="+" Priority="2" Command="{Binding NavigateToAddPageCommand}"/> </TabbedPage.ToolbarItems> <pages:NextPage Title="Jobs"/> <pages:ServiceView Title="Services"/> </TabbedPage>
补充:要是你项目用的是Xamarin.Forms 5.0之前的版本,建议先升到5.0正式版,这个版本修了一大堆TabbedPage工具栏渲染的老bug。
内容的提问来源于stack exchange,提问作者JasonHayes71
相关产品推荐
相关产品推荐

