【发布时间】:2015-08-12 09:37:51
【问题描述】:
如何检测 xamarin 表单 TabbedPage 中的选项卡被触摸? (这与我想出如何检测的页面更改检测不同)
原因如下: 我正在尝试解决一个相当丑陋的标签页溢出 UI (显示在标签栏右侧的丑陋滚动条 每当有 >5 个标签时) 因此,第 5 次按标签显示自定义菜单,按第二次隐藏该菜单,等等。
谢谢!
【问题讨论】:
-
同样的问题。你能给出答案吗?
标签: xamarin.forms
如何检测 xamarin 表单 TabbedPage 中的选项卡被触摸? (这与我想出如何检测的页面更改检测不同)
原因如下: 我正在尝试解决一个相当丑陋的标签页溢出 UI (显示在标签栏右侧的丑陋滚动条 每当有 >5 个标签时) 因此,第 5 次按标签显示自定义菜单,按第二次隐藏该菜单,等等。
谢谢!
【问题讨论】:
标签: xamarin.forms
如果您尝试在 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
【讨论】: