如何检测选项卡在 xamarin 表单 TabbedPage 中被触摸
How do I detect tab was touched in xamarin forms TabbedPage
我如何检测到在 xamarin forms TabbedPage 中触摸了选项卡?
(这与我想出如何检测的页面更改检测不同)
原因如下:
我正在尝试解决一个相当丑陋的标签页溢出 UI
(出现在标签栏右侧的丑陋滚动条
每当有> 5个标签时)
因此,第 5 次按 Tab 键显示自定义菜单,第二次按 Tab 键隐藏该菜单,依此类推。
谢谢!
如果您试图找到在 TabbedPage 中选择了哪个页面,您可以通过这种方式进行。
使用索引值,您可以执行任何您想要的操作..
检测页码事件:
this.CurrentPageChanged += (object sender, EventArgs e) => {
var i = this.Children.IndexOf(this.CurrentPage);
System.Diagnostics.Debug.WriteLine("Page No:"+i);
};
自从有人提出这个问题以来已经有一段时间了,但为了以防万一,这里有一个答案。
点击选项卡时执行操作与以下情况相同:
- 选项卡已更改
- 选项卡已“重新选择”
所以对于第一个你可以使用@femil-shajin的答案或者像我在这里做的那样更直接,对于第二个你需要为 TabbedPage
制作一些自定义渲染器:
public class MyTabbedPage : TabbedPage
{
...
protected override void OnCurrentPageChanged()
{
// do whatever
}
public void OnTabReselected()
{
// do whatever
}
...
}
然后 Android:
[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.Droid.Renderers
{
public class CustomTabbedRenderer : TabbedPageRenderer, NavigationBarView.IOnItemReselectedListener
{
...
protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
GetBottomNavigationView()?.SetOnItemReselectedListener(this);
}
}
private BottomNavigationView GetBottomNavigationView()
{
// this may need to change on some cases
for (var i = 0; i < ViewGroup.ChildCount; i++)
{
var childView = ViewGroup.GetChildAt(i);
if (childView is ViewGroup viewGroup)
{
for (var j = 0; j < viewGroup.ChildCount; j++)
{
var childRelativeLayoutView = viewGroup.GetChildAt(j);
if (childRelativeLayoutView is BottomNavigationView bottomNavigationView)
{
return bottomNavigationView;
}
}
}
}
return null;
}
public void OnNavigationItemReselected(IMenuItem item)
{
if (Element is MyTabbedPage tabbedPage)
{
tabbedPage.OnTabReselected();
}
}
...
}
}
在 iOS 上:
[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.iOS.Renderers
{
public class CustomTabbedRenderer : TabbedRenderer
{
private UITabBarItem _previousSelectedItem;
...
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
if (SelectedIndex < TabBar.Items.Length)
{
_previousSelectedItem = TabBar.Items[SelectedIndex];
}
}
public override void ItemSelected(UITabBar tabbar, UITabBarItem item)
{
if (_previousSelectedItem == item && Element is MyTabbedPage tabbedPage)
{
tabbedPage.OnTabReselected();
}
_previousSelectedItem = item;
}
...
}
}
资料来源:部分内容基于 this page
我如何检测到在 xamarin forms TabbedPage 中触摸了选项卡? (这与我想出如何检测的页面更改检测不同)
原因如下: 我正在尝试解决一个相当丑陋的标签页溢出 UI (出现在标签栏右侧的丑陋滚动条 每当有> 5个标签时) 因此,第 5 次按 Tab 键显示自定义菜单,第二次按 Tab 键隐藏该菜单,依此类推。
谢谢!
如果您试图找到在 TabbedPage 中选择了哪个页面,您可以通过这种方式进行。 使用索引值,您可以执行任何您想要的操作..
检测页码事件:
this.CurrentPageChanged += (object sender, EventArgs e) => {
var i = this.Children.IndexOf(this.CurrentPage);
System.Diagnostics.Debug.WriteLine("Page No:"+i);
};
自从有人提出这个问题以来已经有一段时间了,但为了以防万一,这里有一个答案。
点击选项卡时执行操作与以下情况相同:
- 选项卡已更改
- 选项卡已“重新选择”
所以对于第一个你可以使用@femil-shajin的答案或者像我在这里做的那样更直接,对于第二个你需要为 TabbedPage
制作一些自定义渲染器:
public class MyTabbedPage : TabbedPage
{
...
protected override void OnCurrentPageChanged()
{
// do whatever
}
public void OnTabReselected()
{
// do whatever
}
...
}
然后 Android:
[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.Droid.Renderers
{
public class CustomTabbedRenderer : TabbedPageRenderer, NavigationBarView.IOnItemReselectedListener
{
...
protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
GetBottomNavigationView()?.SetOnItemReselectedListener(this);
}
}
private BottomNavigationView GetBottomNavigationView()
{
// this may need to change on some cases
for (var i = 0; i < ViewGroup.ChildCount; i++)
{
var childView = ViewGroup.GetChildAt(i);
if (childView is ViewGroup viewGroup)
{
for (var j = 0; j < viewGroup.ChildCount; j++)
{
var childRelativeLayoutView = viewGroup.GetChildAt(j);
if (childRelativeLayoutView is BottomNavigationView bottomNavigationView)
{
return bottomNavigationView;
}
}
}
}
return null;
}
public void OnNavigationItemReselected(IMenuItem item)
{
if (Element is MyTabbedPage tabbedPage)
{
tabbedPage.OnTabReselected();
}
}
...
}
}
在 iOS 上:
[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedRenderer))]
namespace MyNamespace.iOS.Renderers
{
public class CustomTabbedRenderer : TabbedRenderer
{
private UITabBarItem _previousSelectedItem;
...
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
if (SelectedIndex < TabBar.Items.Length)
{
_previousSelectedItem = TabBar.Items[SelectedIndex];
}
}
public override void ItemSelected(UITabBar tabbar, UITabBarItem item)
{
if (_previousSelectedItem == item && Element is MyTabbedPage tabbedPage)
{
tabbedPage.OnTabReselected();
}
_previousSelectedItem = item;
}
...
}
}
资料来源:部分内容基于 this page