如何在Xamarin.Forms中检测选项卡按钮的点击?

7

这是我的代码。我想知道如何检测用户何时点击已选择的选项卡,因为我想在aPage的播放图标和暂停图标之间切换,并且我还想调用APage上的一个方法。

public partial class MainPage : TabbedPage
{
    public MainPage()
    {
        InitializeComponent();

        var aPage = new NavigationPage(new APage())
        {
            Title = "Play",
            Icon = "play.png"
        };
        var bPage = new NavigationPage(new BPage())
        { 
            Title = "Settings",
            Icon = "b.png"
        };

        Children.Add(aPage);
        Children.Add(bPage);
    }
}

请注意,如果可能的话,我希望找到一种不涉及iOS和Android的自定义渲染器的解决方案。我想知道是否可以重新定义TabbedPage并将逻辑放在该类中?

这个论坛帖子讨论了如何在Xamarin中实现TabbedPage的事件,以便在单击选项卡时刷新页面或触发其他操作。此外,该帖子还提供了一个指向Stack Overflow上类似问题的链接,其中包含更多关于如何在Xamarin Forms中处理TabbedPage事件的信息。 - Yuri S
这是TabbedPage的默认行为。如果您想要更改,您需要为iOS和Android创建自定义渲染器。 - Ziyad Godil
@Alan 如果需要更多帮助,请告诉我!有时间的话,让我们将其标记为“已回答”,以帮助未来可能遇到相同问题的开发人员! - Brandon Minnick
5个回答

8

我知道你想避免使用自定义渲染器,但是这只有通过使用自定义渲染器才能实现。

代码

Xamarin.Android 自定义渲染器

using Android.Content;
using Android.Support.Design.Widget;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms.Platform.Android.AppCompat;

[assembly: ExportRenderer(typeof(MainPage), typeof(MainPageRenderer))]
namespace YourNameSpace
{
    public class MainPageRenderer : TabbedPageRenderer, TabLayout.IOnTabSelectedListener
    {
        MainPage _page;

        public MainPageRenderer(Context context) : base(context) { }

        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
                _page = e.NewElement as MainPage;
            else
                _page = e.OldElement as MainPage;
        }

        void TabLayout.IOnTabSelectedListener.OnTabReselected(TabLayout.Tab tab)
        {
            System.Diagnostics.Debug.WriteLine("Tab Reselected");
            //Handle Tab Reselected
        }
    }
}

Xamarin.iOS 自定义渲染器

using System;
using System.Diagnostics;

using UIKit;

using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(MainPage), typeof(MainPageRenderer))]
namespace YourNameSpace
{
    public class MainPageRenderer : TabbedRenderer
    {
        MainPage _page;

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
                _page = e.NewElement as MainPage;
            else
                _page = e.OldElement as MainPage;

            try
            {
                if (ViewController is UITabBarController tabBarController)
                    tabBarController.ViewControllerSelected += OnTabbarControllerItemSelected;
            }
            catch (Exception exception)
            {
                Debug.WriteLine(exception);
            }
        }

        void OnTabbarControllerItemSelected(object sender, UITabBarSelectionEventArgs eventArgs)
        {
            if (_page?.CurrentPage?.Navigation != null && _page.CurrentPage.Navigation.NavigationStack.Count > 0)
            {
                Debug.WriteLine("Tab Tapped");
                //Handle Tab Tapped
            }
        }
    }
}

代码来源: @Kyle https://dev59.com/sqDha4cB1Zd3GeqP8QF3#42909203


2
哈。我写那段代码已经两年了,现在我又在尝试做同样的事情,却在别的问题中找到了这个答案,而且是归功于我自己。我甚至都不记得自己写过这个答案了。感谢@Brandon! - Kyle

1

如果您想获取选择的选项卡,则需要使用 ItemSourceSelectedItem 属性,就像 ListView 一样。


1

1
你无法这样做。 TabbedPage 继承自 MultiPage,你可以从 这里 检查源代码。 所有的选择、取消选择、更新、模板和逻辑都在这里实现。 你应该观察 CurrentPage 属性,但如果已经选定,则它具有 值检查,因此你无法使用它。

-2
this.PropertyChanging += async (object sender, PropertyChangingEventArgs e) =>
        {
            if (e.PropertyName == "CurrentPage")
            {
                if (this.CurrentPage == null)
                    return;
            }
        };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接