You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:48:42