Select 禁用的选项卡在自定义 TabbedPage 渲染器上无限期触发 TabSelected 事件
Select a disabled tab firing TabSelected event indefinitely on Custom TabbedPage 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();
}
好的,当我检查 TabbedPageRenderer 源代码时,我发现它有一个针对 TabLayout.IOnTabSelectedListener 的私有实现一旦用户与解决方案进行交互,它就会始终尝试 select 选项卡
_tabLayout.ClearOnTabSelectedListeners();
在 OnElementChanged
您好,我正在尝试根据自定义 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();
}
好的,当我检查 TabbedPageRenderer 源代码时,我发现它有一个针对 TabLayout.IOnTabSelectedListener 的私有实现一旦用户与解决方案进行交互,它就会始终尝试 select 选项卡
_tabLayout.ClearOnTabSelectedListeners();
在 OnElementChanged