选择一个禁用的选项卡,在Custom TabbedPage渲染器上无限期地触发TabSelected事件

时间:2018-01-31 08:55:32

标签: xamarin xamarin.forms xamarin.android custom-renderer

您好我正在尝试根据自定义Xamarin.Forms内容页面中的属性禁用某些选项卡。 我在TabLayout的TabSelected事件中添加了一个处理程序,以便在无法选择其他选项卡的情况下保留当前选定的选项卡。但是,该事件无限期地起火。 我很确定它只会被注册一次所以我不确定为什么会这样做

public class ExtendedTabbedPageRenderer : TabbedPageRenderer
{
    public ExtendedTabbedPageRenderer(Context context) : base(context)
    {
    }

    private TabLayout _tabLayout;
    ViewPager _viewPager;
    private IList<ContentTab> _customTabs;
    private int _lastSelectedPosition;

    protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
    {
        base.OnElementChanged(e);
        for (int i = 0; i < ChildCount; i++)
        {
            var view = GetChildAt(i);
            if (view is TabLayout layout)
                _tabLayout = layout;
            else if (view is ViewPager pager)
                _viewPager = pager;
        }

        _customTabs = e.NewElement.Children.Select(p => (ContentTab)p).ToList();
        //_tabLayout.AddOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(_viewPager));
        _tabLayout.TabSelected += TabLayoutOnTabSelected;
        List<TabLayout.Tab> tt = new List<TabLayout.Tab>();
        for (int i = 0; i < _tabLayout.TabCount; i++)
        {
            tt.Add(_tabLayout.GetTabAt(i));
        }
    }

    private void TabLayoutOnTabSelected(object sender, TabLayout.TabSelectedEventArgs tabSelectedEventArgs)
    {
        var tab = tabSelectedEventArgs.Tab;
        if(tab.Position.Equals(_lastSelectedPosition))
            return;

        var customTab = _customTabs[tab.Position];

        if (customTab.EnableUserInteraction)
        {
            tab.Select();
            _viewPager.SetCurrentItem(tab.Position, true);
            _lastSelectedPosition = tab.Position;
            return;
        }

        _viewPager.SetCurrentItem(_lastSelectedPosition, false);
        var lastTab = _tabLayout.GetTabAt(_lastSelectedPosition);
        lastTab.Select();
    }

1 个答案:

答案 0 :(得分:1)

好的,我通过 TabbedPageRenderer 源代码进行了检查,发现它有 TabLayout.IOnTabSelectedListener 的私有实现,这导致它总是尝试选择标签一旦用户与解决方案进行了互动,就要打电话

_tabLayout.ClearOnTabSelectedListeners();
OnElementChanged

上的