Xamarin 在自定义选项卡页面渲染器上无限期地选择禁用的选项卡触发选项卡选定事件
您好,我正在尝试基于自定义Xamarin.Forms内容页中的属性禁用某些选项卡。 我在TabLayout的TabSelected事件中添加了一个处理程序,以便在无法选择其他选项卡时保留当前选中的选项卡。然而,这一事件使火势无限期地持续下去。 我很确定它只注册了一次,所以我不知道为什么会这样Xamarin 在自定义选项卡页面渲染器上无限期地选择禁用的选项卡触发选项卡选定事件,xamarin,xamarin.forms,xamarin.android,custom-renderer,Xamarin,Xamarin.forms,Xamarin.android,Custom Renderer,您好,我正在尝试基于自定义Xamarin.Forms内容页中的属性禁用某些选项卡。 我在TabLayout的TabSelected事件中添加了一个处理程序,以便在无法选择其他选项卡时保留当前选中的选项卡。然而,这一事件使火势无限期地持续下去。 我很确定它只注册了一次,所以我不知道为什么会这样 public class ExtendedTabbedPageRenderer : TabbedPageRenderer { public ExtendedTabbedPageRenderer(Co
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();
}
公共类扩展的TabbedPageRenderer:TabbedPageRenderer
{
公共扩展TabbedPageRenderer(上下文):基本(上下文)
{
}
私人展台(TabLayout);;
ViewPager\u ViewPager;
私人IList_customTabs;
private int_last selected position;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
for(int i=0;i(ContentTab)p.ToList();
//_tabLayout.addontAbsSelectedListener(新tabLayout.viewPagerOnAbsSelectedListener(_viewPager));
_tabLayout.TabSelected+=tablayoutonabselected;
List tt=新列表();
对于(int i=0;i<\u tabLayout.TabCount;i++)
{
tt.Add(_tabLayout.GetTabAt(i));
}
}
私有无效TabLayoutOnTabSelected(对象发送方,TabLayout.TabSelectedEventArgs选项卡SelectedEventArgs)
{
var tab=tabSelectedEventArgs.tab;
如果(制表位等于(_lastSelectedPosition))
返回;
var customTab=_customTabs[tab.Position];
if(customTab.EnableUserInteraction)
{
tab.Select();
_viewPager.SetCurrentItem(tab.Position,true);
_lastSelectedPosition=制表符位置;
返回;
}
_viewPager.SetCurrentItem(\u lastSelectedPosition,false);
var lastTab=\u tabLayout.GetTabAt(\u lastSelectedPosition);
lastTab.Select();
}
好的,当我查看选项卡页面渲染器源代码时,我发现它有一个TabLayout.IOnTabSelectedListener的私有实现,这使得它总是在用户与解决方案交互后尝试选择选项卡
_tabLayout.ClearOnTabSelectedListeners();
在OneElementChanged上