Xamarin RefreshView вызывает конфликты Tapped Event в UWP

У меня есть многоплатформенный проект Xamarin с MainPage (называемый OVerviewPage), который имеет несколько FlexLayouts, каждый из которых привязан к другому BindableLayout.ItemSource. BindableLayout.ItemTemplate для каждого из них представляет собой ContentView, каждый из которых отформатирован одинаково, но каждый из них имеет разные ViewModel.Model. Каждый из этих ContentView имеет свой собственный <Frame.GestureRecognizers> TapGestureRocgnizer, вызывающий событие Tapped, обрабатываемое в коде позади. Эти Flexlayouts завернуты в ScrollView, который также завернут в RefreshView. Цель состоит в том, чтобы пользователь щелкнул один из них, чтобы ContentViews были перенаправлены на страницу сведений. Проблема в том, что RefreshView вызывает конфликт при компиляции для UWP на рабочем столе Windows. Проблема заключается в том, что после прокрутки списка вниз и щелчка пользователем ContentView будет вызван обработчик TappedEvent другого ContentView, а не того, на который на самом деле нажал пользователь. Фактически, когда форма впервые загружается, на экране видны 3 ContentView, когда другие прокручиваются и находятся в месте, где был один из первых 3, только событие касания одного из этих первых 3 будет реагировать на щелчок. , в зависимости от того, где на экране щелкнул пользователь. Когда я комментирую RefreshView в xaml, клики работают так, как ожидалось. Я понимаю, что RefreshView не предназначен для настольных устройств, и я попытался отключить его, используя: if (Device.Idiom == DeviceIdiom.Desktop){refreshview.IsEnabled = false}, но это не работает. Сам факт того, что он идентифицирован в xaml, вызывает конфликт. Пара соображений: эта страница является главной страницей приложения Shell, и любое решение должно учитывать это. Я также открыт для любого решения, которое решает эту проблему. заранее спасибо

Моя страница обзора: (только соответствующий код)

            <RefreshView IsRefreshing = "{Binding IsRefreshing, Mode=OneWay}"
                     RefreshColor = "Teal"
                     Command = "{Binding RefreshCommand}">
            
            <ScrollView>
                <StackLayout Margin = "10,0,10,0">
                    
                    <FlexLayout Direction = "Column"
                                Wrap = "NoWrap"
                                AlignItems = "Stretch"
                                AlignContent = "Center"
                                BindableLayout.ItemsSource = "{Binding TrackWarrants}"
                                BindableLayout.ItemTemplate = "{StaticResource TrackWarrantTemplate}" 
                                BindableLayout.EmptyViewTemplate = "{StaticResource EmptyWarrantTemplate}"/>
                                 
                    <!--Form As-->
                    <FlexLayout Direction = "Column"
                            Wrap = "NoWrap"
                            AlignItems = "Stretch"
                            AlignContent = "Center"
                            BindableLayout.ItemsSource = "{Binding FormAs}"
                            BindableLayout.ItemTemplate = "{StaticResource FormATemplate}" 
                            BindableLayout.EmptyViewTemplate = "{StaticResource EmptyFormATemplate}"/>
                    
                    <!--Form Bs-->                      
                    <FlexLayout Direction = "Column"
                                Wrap = "NoWrap"
                                AlignItems = "Stretch"
                                AlignContent = "Center"
                                BindableLayout.ItemsSource = "{Binding FormBs}"
                                BindableLayout.ItemTemplate = "{StaticResource FormBTemplate}" 
                                BindableLayout.EmptyViewTemplate = "{StaticResource EmptyFormBTemplate}"/>

                    <!--Form Cs-->
                    <FlexLayout Direction = "Column"
                                Wrap = "NoWrap"
                                AlignItems = "Stretch"
                                AlignContent = "Center"
                                BindableLayout.ItemsSource = "{Binding FormCs}"
                                BindableLayout.ItemTemplate = "{StaticResource FormCTemplate}" 
                                BindableLayout.EmptyViewTemplate = "{StaticResource EmptyFormCTemplate}"/>

Код ContentViews: (только 1 например они все одинаковы кроме размещения данных)

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

        <Grid  >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width = "30"/>
                <ColumnDefinition Width = "70"/>
                <ColumnDefinition Width = "25"/>
                <ColumnDefinition Width = "25"/>
                <ColumnDefinition Width = "25"/>
                <ColumnDefinition Width = "30"/>
                <ColumnDefinition Width = "95"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height = "25"/>
                <RowDefinition Height = "25"/>
                <RowDefinition Height = "Auto"/>
                <RowDefinition Height = "20"/>
            </Grid.RowDefinitions>

            <StackLayout Grid.Column = "0" Grid.Row = "0" Grid.RowSpan = "2" Grid.ColumnSpan = "2" HorizontalOptions = "StartAndExpand" VerticalOptions = "Start" 
                         Orientation = "Horizontal" WidthRequest = "130" >
                <Label FontFamily = "Material" FontSize = "Large" Text = "{Binding Icon}" HorizontalOptions = "Start" VerticalOptions = "Start"
                   Grid.Column = "0" Grid.Row = "0" Grid.RowSpan = "2">
                    <Label.Triggers>
                        <DataTrigger TargetType = "Label" Binding = "{Binding Source = {x:Reference Reject},Path=Text}" Value = "True">
                            <Setter Property = "TextColor" Value = "Black"/>
                        </DataTrigger>
                    </Label.Triggers>
                </Label>
                <Label  FontSize = "Medium" FontAttributes = "Bold" HorizontalOptions = "Start"
                    VerticalOptions = "Start" x:Name = "FormID">
                    <Label.FormattedText>
                        <FormattedString>
                            <Span Text = "{Binding FormNumber}"/>
                            <Span Text = "-"/>
                            <Span Text = "{Binding LineNo}"/>
                        </FormattedString>
                    </Label.FormattedText>
                    <Label.Triggers>
                        <DataTrigger TargetType = "Label" Binding = "{Binding Source = {x:Reference Reject},Path=Text}" Value = "True">
                            <Setter Property = "TextColor" Value = "Black"/>
                        </DataTrigger>
                    </Label.Triggers>
                </Label>
                <StackLayout.Triggers>
                    <DataTrigger TargetType = "StackLayout" Binding = "{Binding Source = {x:Reference Reject},Path=Text}" Value = "True">
                        <Setter Property = "BackgroundColor" Value = "Salmon"/>
                    </DataTrigger>
                </StackLayout.Triggers>
            </StackLayout>
            
            <Label Text = "{Binding Territory}" 
               FontSize = "Small"
               VerticalOptions = "Center"
               HorizontalOptions = "Start"
               Grid.Column = "0"
               Grid.Row = "3" Grid.ColumnSpan = "6" />

            <Label FontFamily = "Material" 
               FontSize = "Small" 
               Text = "{x:Static md:MaterialDesignIcons.MyLocation}" 
               HorizontalOptions = "Center"
               Grid.Column = "2"
               Grid.Row = "0"  />

            <Label Text = "{Binding From}" 
               FontSize = "Small"     
               Grid.Column = "3"
               Grid.Row = "0" Grid.ColumnSpan = "4" />

            <Label FontFamily = "Material" 
               FontSize = "Small" 
               Text = "{x:Static md:MaterialDesignIcons.LocationOn}" 
               HorizontalOptions = "Center"
               Grid.Column = "2"
               Grid.Row = "1" />

            <Label Text = "{Binding End}" 
               FontSize = "Small"   
               Grid.Column = "3"    
               Grid.Row = "1"  Grid.ColumnSpan = "4"  />
            
            <Label FontSize = "Small"  
               FontAttributes = "Bold" 
               HorizontalOptions = "StartAndExpand"
               Grid.Column = "1"
               Grid.Row = "2"   
               Grid.ColumnSpan = "5">
                <Label.FormattedText>
                    <FormattedString>
                        <Span Text = "Speed: "/>
                        <Span Text = "{Binding Speed}"/>
                    </FormattedString>
                </Label.FormattedText>
            </Label>

            <Label x:Name = "Reject" Text = "{Binding Rejected}" 
               FontSize = "Small"                  
               Grid.Column = "0"
               Grid.Row = "3" IsVisible = "False" />
            <Label x:Name = "status" Text = "{Binding StatusID}" 
               FontSize = "Small"                  
               Grid.Column = "0"
               Grid.Row = "3" IsVisible = "False" ></Label>
        </Grid>
    </Frame>
</ContentView.Content>

Соответствующий код для ContentView:

        public FormACard()
    {
        InitializeComponent();
        formaviewmodel = new FormAViewModel();
        BindingContext = formaviewmodel;
    }
    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}");
            }

        }
    }

К вашему сведению. Если это выглядит знакомо, я разместил эту проблему в другой теме, когда у меня было меньше информации. Я закрыл другой и открыл этот со свежей информацией.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в том, что после прокрутки списка вниз и щелчка пользователем ContentView будет вызван обработчик TappedEvent другого ContentView, а не того, на который на самом деле нажал пользователь.

О «Xamarin RefreshView, вызывающем конфликты Tapped Event в UWP», я нашел это на GitHub: [Ошибка] Неправильное поведение при использовании BindableLayout, обернутого RefreshView. В ссылке упоминается:

Протестировано на основе вашего репродукции. Выяснилось, что это не связано с BindableLayout: вы можете полностью исключить его, просто создав 20 кадров напрямую, и это приведет к тому же неправильному поведению. Похоже, что, как только используется RefreshView (UWP RefreshContainer), события касания отправляются неправильным элементам управления пользовательского интерфейса и/или это смещение прокрутки не учитывается правильно. В настоящее время не уверен, является ли это ошибкой XF или проблемой в UWP RefreshContainer, хотя я не нашел подходящей проблемы (после непродолжительного поиска).

Если RefreshView не влияет на работу всей вашей программы, вы можете его удалить. В противном случае вы можете подождать, пока ошибка не будет исправлена.

Желание это может помочь вам.

Сан, хотя это не тот ответ, на который я надеялся, он, безусловно, проясняет, почему я вижу эту проблему и не могу найти способ ее преодолеть. Поскольку эта страница обзора используется во всех трех проектах, RefreshView является необходимостью для двух других. Таким образом, для решения этой проблемы можно поместить новую страницу обзора без RefreshView в папку проекта UWP. Поскольку это проект Shell, мне нужно будет скрыть вкладку Shell телефона, когда он будет построен. Если вы знаете способ сделать это, это поможет. В противном случае я открою новую тему. Спасибо за вашу помощь

Gary H 12.04.2023 15:39

Другие вопросы по теме