如何检测选项卡在 xamarin 表单 TabbedPage 中被触摸

How do I detect tab was touched in xamarin forms TabbedPage

我如何检测到在 xamarin forms TabbedPage 中触摸了选项卡? (这与我想出如何检测的页面更改检测不同)

原因如下: 我正在尝试解决一个相当丑陋的标签页溢出 UI (出现在标签栏右侧的丑陋滚动条 每当有> 5个标签时) 因此,第 5 次按 Tab 键显示自定义菜单,第二次按 Tab 键隐藏该菜单,依此类推。

谢谢!

如果您试图找到在 TabbedPage 中选择了哪个页面,您可以通过这种方式进行。 使用索引值,您可以执行任何您想要的操作..

检测页码事件:

    this.CurrentPageChanged += (object sender, EventArgs e) => {
            var i = this.Children.IndexOf(this.CurrentPage);
            System.Diagnostics.Debug.WriteLine("Page No:"+i);
        };

自从有人提出这个问题以来已经有一段时间了,但为了以防万一,这里有一个答案。

点击选项卡时执行操作与以下情况相同:

  • 选项卡已更改
  • 选项卡已“重新选择”

所以对于第一个你可以使用@femil-shajin的答案或者像我在这里做的那样更直接,对于第二个你需要为 TabbedPage 制作一些自定义渲染器:

public class MyTabbedPage : TabbedPage
{
    ...

    protected override void OnCurrentPageChanged()
    {
         // do whatever
    }    
    
    public void OnTabReselected()
    {
         // do whatever
    }

    ...
}

然后 Android:

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.Droid.Renderers
{
    public class CustomTabbedRenderer : TabbedPageRenderer, NavigationBarView.IOnItemReselectedListener
    {
        ...
        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                GetBottomNavigationView()?.SetOnItemReselectedListener(this);
            }
        }

        private BottomNavigationView GetBottomNavigationView()
        {
            // this may need to change on some cases 
            for (var i = 0; i < ViewGroup.ChildCount; i++)
            {
                var childView = ViewGroup.GetChildAt(i);
                if (childView is ViewGroup viewGroup)
                {
                    for (var j = 0; j < viewGroup.ChildCount; j++)
                    {
                        var childRelativeLayoutView = viewGroup.GetChildAt(j);
                        if (childRelativeLayoutView is BottomNavigationView bottomNavigationView)
                        {
                            return bottomNavigationView;
                        }
                    }
                }
            }
            return null;
        }

        public void OnNavigationItemReselected(IMenuItem item)
        {
            if (Element is MyTabbedPage tabbedPage)
            {
                tabbedPage.OnTabReselected();
            }
        } 
        ...
    }
}

在 iOS 上:

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.iOS.Renderers
{
    public class CustomTabbedRenderer : TabbedRenderer
    {
        private UITabBarItem _previousSelectedItem;

        ...
        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);

            if (SelectedIndex < TabBar.Items.Length)
            {
                _previousSelectedItem = TabBar.Items[SelectedIndex];
            }
        }

        public override void ItemSelected(UITabBar tabbar, UITabBarItem item)
        {
            if (_previousSelectedItem == item && Element is MyTabbedPage tabbedPage)
            {
                tabbedPage.OnTabReselected();
            }
            _previousSelectedItem = item;
        }
        ...
    }
}

资料来源:部分内容基于 this page