Xamarin.Forms的TabbedPage在当前选项卡被点击时触发事件以刷新页面

7
我正在使用Xamarin.Forms构建一个iOS/Android应用程序,并且有一个TabbedPage。
如果用户已经在第二个选项卡上,而且点击了第二个选项卡,则我希望选项卡2刷新,或者运行我的自定义函数以便我自己刷新它。
在Xamarin.Forms中是否有这样的方法,或者使用自定义渲染器的方法来实现?
2个回答

9
这是我解决问题的方法。我的TabbedPage包含每个选项卡的NavigationPage,所以如果您没有使用导航页,您的代码将稍微改变。您可以在iOS的OnTabbarControllerItemSelected和Android的OnTabbarControllerItemSelected中放置“刷新”逻辑。请查看下面的代码。
Android渲染器(由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();
        }
    }
}

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();
            }

        }
    }
}

当使用 ToolbarPlacement.Bottom 时,您需要另一个监听器:https://forums.xamarin.com/discussion/133429/how-do-i-get-the-tabreselect-event-with-tabbar-at-the-bottom-on-android - Dennis Schröer

4

请研究Android Native中的 TabLayout,点击事件的回调函数是OnTabReselected

根据TabbedPageRenderer源代码,您会发现未实现OnTabReselected

所以我创建了一个自定义渲染器用于TabbedPage,以下是代码,并实现了OnTabReselected函数以更改当前页面的背景:

[assembly: ExportRenderer(typeof(Page1), typeof(MyTabPageRender))]
namespace XamarinTabbedPage_Demo.Droid
{
    public class MyTabPageRender : TabbedPageRenderer, TabLayout.IOnTabSelectedListener
    {
        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);
        }
        void TabLayout.IOnTabSelectedListener.OnTabReselected(TabLayout.Tab tab)
        {
            int selectedIndex = tab.Position;
            if (Element.Children.Count > selectedIndex && selectedIndex >= 0)
            {
                Element.CurrentPage = Element.Children[selectedIndex];

                if (selectedIndex == 0)
                {
                    Element.CurrentPage.BackgroundColor = Color.Black;
                }
            }
        }
    }
}

enter image description here


谢谢Mike!这对我帮助很大。我后来也能够解决iOS的问题,并且这个周末我会在这里发布它。 - Kyle
我知道这是一个非常古老的帖子,但现在遇到了它。我尝试过这种方法,但它不再起作用,因为相关的库TabLayout.IOnTabSelectedListener已经过时了。而且在我使用的TabbedPage上从未调用过该事件,不过我正在使用Reactive UI和ReactiveTabbedPage,所以可能它没有触发该事件。 - est005

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