轻按当前选项卡以刷新页面时的Xamarin.Forms TabbedPage事件

Kyl*_*yle 3 android xamarin.ios xamarin.android xamarin xamarin.forms

我正在使用Xamarin.Forms来构建iOS / Android应用,并且具有TabbedPage。

如果用户已经在选项卡2上,并且单击了Tab2,并且我希望刷新Tab2或运行自己的功能,那么我可以自己刷新它。

是否可以在Xamarin.Forms内执行此操作,还是可以使用自定义渲染器执行此操作?

Kyl*_*yle 6

这就是我最终解决问题的方式。我的TabbedPage由每个选项卡的NavigationPage组成,因此,如果您不使用导航页,您的代码将不得不稍作更改,但只需稍作更改。您可以在OnTabbarControllerItemSelectediOS和OnTabbarControllerItemSelectedAndroid中放入“刷新”逻辑。查看下面的代码。

Android Renderer(由Mike Ma提供)

using Android.Support.Design.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms.Platform.Android.AppCompat;
[assembly: ExportRenderer(typeof(MainTabbedPage), typeof(MainPageRenderer))]
namespace YourNameSpace
{
    public class MainPageRenderer : TabbedPageRenderer, TabLayout.IOnTabSelectedListener
    {
        private MainTabbedPage _page;
        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                _page = (MainTabbedPage)e.NewElement;
            }
            else
            {
                _page = (MainTabbedPage)e.OldElement;
            }

        }
        async void TabLayout.IOnTabSelectedListener.OnTabReselected(TabLayout.Tab tab)
        {
            await _page.CurrentPage.Navigation.PopToRootAsync();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

iOs渲染器:

using UIKit;
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(MainTabbedPage), typeof(MainPageRenderer))]
namespace YourNameSpace
{
    public class MainPageRenderer : TabbedRenderer
    {
        private MainTabbedPage _page;
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                _page = (MainTabbedPage)e.NewElement;
            }
            else
            {
                _page = (MainTabbedPage)e.OldElement;
            }

            try
            {
                var tabbarController = (UITabBarController)this.ViewController;
                if (null != tabbarController)
                {
                    tabbarController.ViewControllerSelected += OnTabbarControllerItemSelected;
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }

        private async void OnTabbarControllerItemSelected(object sender, UITabBarSelectionEventArgs eventArgs)
        {
            if (_page?.CurrentPage?.Navigation != null && _page.CurrentPage.Navigation.NavigationStack.Count > 0)
            {
                await _page.CurrentPage.Navigation.PopToRootAsync();
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)