首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >TabbedPage上的Retap事件

TabbedPage上的Retap事件
EN

Stack Overflow用户
提问于 2019-02-20 17:51:54
回答 3查看 172关注 0票数 0

我正在尝试为UWP上的TabbedPage捕获重新点击事件。

this page中,我可以看到您需要创建一个自定义渲染器。当我尝试使用Xamarin.Forms.Platform.UWP.TabbedPageRenderer时,我找不到任何合适的事件来订阅。

我尝试过TappedFocused事件,但它们似乎不像我期望的那样工作。

如何检测选项卡在UWP上是否被重新点击?

这是我到目前为止尝试过的:

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-21 21:16:23

根据DavidS的回答,下面是我使用的代码,它还处理UWP选项卡中的图标:

代码语言:javascript
复制
// 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;
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-02-21 04:22:08

简短的回答是否定的,就我所知,你不能轻易地在UWP上检测到tab重击/重选,至少在没有深入Xamarin.Forms源代码的情况下,看看他们是如何实现uWP TabbedPageRenderer的。

下面是我是如何实现它的:

代码语言:javascript
复制
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/

票数 1
EN

Stack Overflow用户

发布于 2019-02-20 18:02:33

基于你的解释,我已经更新了你的代码,希望这能有所帮助:

代码语言:javascript
复制
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;
    }
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54783349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档