Xamarin Forms TapGestureRecognizer 不适用于 UWP

问题描述 投票:0回答:0

我有一个 Xamarin Forms 多平台应用程序,它使用 TapGestureRecognizer 来访问详细信息页面。我让它在 Android 和 iOS 上成功运行,但是现在我被要求拥有 UWP 版本。我有概述页面,其中包含显示基本信息的不同类型的表格。我遇到的问题是,在几个内容视图(列表顶部的那些)上,我点击并转到正确的详细信息页面。但是那些在列表后面的人,当点击时将我带到列表顶部的一个随机页面,而不是正确的详细信息页面。我在网上搜索过,发现这个问题被问过多次,但似乎从来没有真正的答案。所以任何帮助都会受到欢迎。我尝试在下面发布相关代码,但不知道问题出在哪里,我也不想发布整个项目。 编辑清楚 问题是当我在桌面上运行 UWP 应用程序并使用鼠标指针和左键单击作为手机触摸屏上的手指点击时。

Overviewpage 是一个在 Flexlayout 中带有模板的 ContentPage:

 <ContentPage.Content>
    
    <StackLayout Margin="0,0,0,0">              
            <ScrollView>
                <StackLayout Margin="10,0,10,0">

                    <Label x:Name="FormAHeader" 
                            FontSize="Title"
                            FontFamily="Calibri"
                            TextColor="{StaticResource TracsisGrey}"
                            Text="Form As" />
                    <Label x:Name="lblFormAData" 
                            FontSize="Small"
                            FontFamily="Calibri"
                            TextColor="{StaticResource TracsisGrey}"
                            Text="{Binding BulletinStateText}" BackgroundColor="{Binding BulletinStateColor}" />
                    <FlexLayout Direction="Column"
                            Wrap="NoWrap"
                            AlignItems="Stretch"
                            AlignContent="Center"
                            BindableLayout.ItemsSource="{Binding FormAs}"
                            BindableLayout.ItemTemplate="{StaticResource FormATemplate}" 
                            BindableLayout.EmptyViewTemplate="{StaticResource EmptyFormATemplate}"/>
                    
                    <!--Form Bs-->                      
                    <Label x:Name="FormBHeader" 
                            FontSize="Title"
                            FontFamily="Calibri"
                            TextColor="{StaticResource TracsisGrey}"
                            Text="Form Bs" />
                    <Label x:Name="lblFormBData" 
                            FontSize="Small"
                            FontFamily="Calibri"
                            TextColor="{StaticResource TracsisGrey}"
                            Text="{Binding BulletinStateText}" BackgroundColor="{Binding BulletinStateColor}" />
                    <!--IsVisible="{Binding TWIsVisible}"/>-->
                    <FlexLayout Direction="Column"
                                Wrap="NoWrap"
                                AlignItems="Stretch"
                                AlignContent="Center"
                                BindableLayout.ItemsSource="{Binding FormBs}"
                                BindableLayout.ItemTemplate="{StaticResource FormBTemplate}" 
                                BindableLayout.EmptyViewTemplate="{StaticResource EmptyFormBTemplate}"/>

Flexlayout 的内容是一个带有 TapGestureRecognizer 的 ContentView:

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:md="clr-namespace:MaterialDesign"             
         xmlns:models="clr-namespace:RailComm.DTW.Mobile.Models"
         x:DataType="models:FormA"
         x:Class="RailComm.DTW.Mobile.Components.FormACard">


<ContentView.Content>
    <Frame>
        <Frame.GestureRecognizers>
        <TapGestureRecognizer CommandParameter="{Binding}" Tapped="FormA_Tapped" />
        </Frame.GestureRecognizers>

        <Grid  >
            <Grid.ColumnDefinitions>

*** 删除了很多 ContentView 细节,不确定是否有意义

处理点击事件的代码:

        private async void FormA_Tapped(object sender, EventArgs e)
    {
        var user = App.LoggedInUser.UserName;

        var ea = e as TappedEventArgs;
        if (ea.Parameter != null)
        {
            var forminfo = JsonConvert.SerializeObject(ea.Parameter);
            string _forminfo = Uri.EscapeDataString(forminfo);
            FormA forma = (FormA)ea.Parameter;
            bool rejectAck = forma.RejectionAcked;
            bool rejected = forma.Rejected;
            string requestor = forma.RequestedBy;
            if (!rejectAck && rejected && requestor == user)
            {
                await Shell.Current.GoToAsync($"{nameof(RejectACK)}?{nameof(RejectACK.Contentx)}={_forminfo}");
            }
            else
            {
                await Shell.Current.GoToAsync($"viewforma?Content={_forminfo}");
            }

        }
    }
xamarin.forms uwp uitapgesturerecognizer
© www.soinside.com 2019 - 2024. All rights reserved.