【问题标题】:Xamarin.Forms TabbedPage event when current tab is tapped to refresh the page点击当前选项卡以刷新页面时的 Xamarin.Forms TabbedPage 事件
【发布时间】:2017-08-05 16:30:40
【问题描述】:

我正在使用 Xamarin.Forms 构建一个 iOS/Android 应用程序,并且有一个 TabbedPage。

如果用户已经在 Tab 2 上,并且单击了 Tab2,并且我希望刷新 tab2,或者运行我自己的函数以便我自己刷新它。

有没有办法在 Xamarin.Forms 中执行此操作,或使用自定义渲染器执行此操作?

【问题讨论】:

    标签: android xamarin xamarin.ios xamarin.android xamarin.forms


    【解决方案1】:

    这就是我最终解决问题的方法。我的 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();
                }
    
            }
        }
    }
    

    【讨论】:

    【解决方案2】:

    研究一下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;
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 谢谢迈克!这对我帮助很大。稍后我能够找到 iOS 版本,并将在本周末将其发布在这里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2016-07-05
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多