我正在尝试为UWP上的TabbedPage
捕获重新点击事件。
在this page中,我可以看到您需要创建一个自定义渲染器。当我尝试使用Xamarin.Forms.Platform.UWP.TabbedPageRenderer
时,我找不到任何合适的事件来订阅。
我尝试过Tapped
和Focused
事件,但它们似乎不像我期望的那样工作。
如何检测选项卡在UWP上是否被重新点击?
这是我到目前为止尝试过的:
public class TabbedPageCustomRenderer : TabbedPageRenderer
{
private TabbedHomePage _page;
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
_page = (TabbedHomePage)e.NewElement;
}
else
{
_page = (TabbedHomePage)e.OldElement;
}
//_page.Focused += _page_Focused;
//this.Control.Tapped += Control_Tapped;
// what should I subscribe to?
}
private async void _page_Focused(object sender, Xamarin.Forms.FocusEventArgs e)
{
if (_page?.CurrentPage?.Navigation != null && _page.CurrentPage.Navigation.NavigationStack.Count > 0)
{
await _page.CurrentPage.Navigation.PopToRootAsync();
}
}
private async void Control_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
if (_page?.CurrentPage?.Navigation != null && _page.CurrentPage.Navigation.NavigationStack.Count > 0)
{
await _page.CurrentPage.Navigation.PopToRootAsync();
}
}
}
发布于 2019-02-21 21:16:23
根据DavidS的回答,下面是我使用的代码,它还处理UWP选项卡中的图标:
// this is C# 7, so will only work with a recent c# compiler
public class TabbedPageCustomRenderer : TabbedPageRenderer
{
private Xamarin.Forms.Page _prevPage;
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
Control.Tapped += Control_Tapped;
_prevPage = Control.SelectedItem as Xamarin.Forms.Page;
}
private async void Control_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
// replace 'TabbedHomePage' with whatever your page type is with the tabs
if (!(this.Element is TabbedHomePage))
return;
switch (e.OriginalSource)
{
case Image image when image.Parent is StackPanel:
{
var sp = (StackPanel)image.Parent;
var tb = sp.Children.Where(c => c is TextBlock).FirstOrDefault() as TextBlock;
await HandleRetab(tb);
break;
}
case TextBlock tb:
{
await HandleRetab(tb);
break;
}
default:
break;
}
async Task HandleRetab(TextBlock tb)
{
if (tb == null)
return;
var newPage = tb.DataContext as Xamarin.Forms.Page;
if (newPage == _prevPage &&
tb.Name == "TabbedPageHeaderTextBlock")
{
// do your thing here, a tab retap happened, like:
await newPage.Navigation.PopToRootAsync();
}
_prevPage = newPage;
}
}
}
发布于 2019-02-21 04:22:08
简短的回答是否定的,就我所知,你不能轻易地在UWP上检测到tab重击/重选,至少在没有深入Xamarin.Forms源代码的情况下,看看他们是如何实现uWP TabbedPageRenderer的。
下面是我是如何实现它的:
public class MainTabPageRenderer : TabbedPageRenderer
{
private Xamarin.Forms.Page _prevPage;
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
Control.Tapped += Control_Tapped;
_prevPage = Control.SelectedItem as Xamarin.Forms.Page;
}
private async void Control_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
var src = e.OriginalSource as TextBlock;
if (src != null
&& src.Name == "TabbedPageHeaderTextBlock"
&& Element is TabReselectDemo.MainPage)
{
var newPage = src.DataContext as Xamarin.Forms.Page;
if (newPage == _prevPage)
{
// do your thing here, a tab retap happened, like:
await newPage.Navigation.PopToRootAsync();
}
_prevPage = newPage;
}
}
}
TabbedPageHeaderTextBlock是UWP渲染器内部的一部分。考虑到它没有文档记录,这并不理想,因为理论上它可能会在未来的Xamarin.Forms版本中发生变化,但它已经稳定了一段时间。
这应该足以为您解决这个问题,但更多细节在这里:https://criticalhittech.com/2017/09/25/tab-reselection-in-xamarin-forms-part-2/。
发布于 2019-02-20 18:02:33
基于你的解释,我已经更新了你的代码,希望这能有所帮助:
public class TabbedPageCustomRenderer : TabbedPageRenderer
{
private TabbedHomePage _page;
bool isRetap = false;
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
_page = (TabbedHomePage)e.NewElement;
}
else
{
_page = (TabbedHomePage)e.OldElement;
}
//_page.Focused += _page_Focused;
this.Control.Tapped += Control_Tapped;
// what should I subscribe to?
}
private async void _page_Focused(object sender, Xamarin.Forms.FocusEventArgs e)
{
if (_page?.CurrentPage?.Navigation != null && _page.CurrentPage.Navigation.NavigationStack.Count > 0)
{
await _page.CurrentPage.Navigation.PopToRootAsync();
}
}
private async void Control_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
if (isRetap && _page?.CurrentPage?.Navigation != null && _page.CurrentPage.Navigation.NavigationStack.Count > 0)
{
await _page.CurrentPage.Navigation.PopToRootAsync();
}
isRetap = true;
}
}
https://stackoverflow.com/questions/54783349
复制相似问题