Требуется исправление: невозможно открыть модальное окно с помощью кнопки внутри пользовательского элемента управления внутри Listview-DataTemplate-ViewCell

У меня странная проблема, но это может быть потому, что я не понимаю. Я создал 2 пользовательских элемента управления. [Пользовательский элемент управления A] имеет кнопку с именем [ЗАПУСК], которая запускает модальное окно. [Пользовательский элемент управления B] не имеет кнопок, но внутри него находится пользовательский элемент управления A.

Я создал страницу с помощью [Custom Control B], но когда я нажимаю [LAUNCH], во время отладки она переходит к строке кода, в которой говорится, что await Navigation.PushModalAsync(new ModalPage()) но после этого он не запускает Модальный.

Я попытался просто добавить [Customer Control A] и нажать [LAUNCH], и он смог отобразить модальное окно.

Есть ли что-то, что мне нужно сделать, чтобы открыть модальное окно из пользовательского элемента управления B?

Обновлено: После дальнейшей проверки я забыл упомянуть, что [Пользовательский элемент управления B] — это элемент управления, который я привязываю к шаблонам элементов списка. Я снова проверил, просто загрузив один [Пользовательский элемент управления B] без списка, и он смог открыть модальное окно. Однако, когда я возвращаю его в список в качестве шаблона элемента, проблема сохраняется. Нужно ли мне что-то делать, чтобы это могло работать? Или это невозможно?

Обновлено еще раз: Сделал новый образец проекта и изолировал случай, похоже, что он действительно препятствует открытию модального окна.

[Пользовательский элемент управления А]

<ContentView xmlns = "http://xamarin.com/schemas/2014/forms" 
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class = "TestXamarin.Controls.CustomControlA">
  <ContentView.Content>
        <Grid BackgroundColor = "AliceBlue" HeightRequest = "300">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width = "2*"/>
                <ColumnDefinition Width = "*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height = "*" />
                <RowDefinition Height = "*" />
            </Grid.RowDefinitions>
            <FlexLayout Grid.Column = "0"
                    Grid.Row = "0"
                    Grid.RowSpan = "2"/>
            <Button x:Name = "btnOpen"
                    Text = "Try Open Modal"
                    Clicked = "BtnOpen_Clicked"
                    Grid.Column = "1"
                    Grid.Row = "0"/>
        </Grid>
    </ContentView.Content>
</ContentView>

[Пользовательский элемент управления A].cs

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class CustomControlA : ContentView
    {
        public CustomControlA()
        {
            InitializeComponent();
        }

        private async void BtnOpen_Clicked(object sender, EventArgs e)
        {
            await Navigation.PushModalAsync(new Modal());
        }
    }

[Пользовательский элемент управления B]

<ContentView xmlns = "http://xamarin.com/schemas/2014/forms" 
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls = "clr-namespace:TestXamarin.Controls"
             x:Class = "TestXamarin.Controls.CustomControlB">
  <ContentView.Content>
        <Frame BorderColor = "Accent"
               HeightRequest = "300"
               WidthRequest = "300">
            <controls:CustomControlA
                VerticalOptions = "CenterAndExpand"
                HorizontalOptions = "CenterAndExpand"></controls:CustomControlA>
        </Frame>
  </ContentView.Content>
</ContentView>

[Пользовательский элемент управления B].cs

[XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class CustomControlB : ContentView
    {
        public CustomControlB()
        {
            InitializeComponent();
        }
    }

[Главная страница]

<ContentPage xmlns = "http://xamarin.com/schemas/2014/forms"
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local = "clr-namespace:TestXamarin"
             xmlns:controls = "clr-namespace:TestXamarin.Controls"
             x:Class = "TestXamarin.MainPage">
    <ListView x:Name = "listSample"
              HasUnevenRows = "True">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <controls:CustomControlB/>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</ContentPage>

[Главная страница].cs

   public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();

            var list = Enumerable.Range(1, 10).ToList();

            listSample.ItemsSource = list;
        }


    }

не могли бы вы показать свой код?

Leo Zhu - MSFT 22.05.2019 04:53

Привет Лео, я добавил свой код. Дайте мне знать, если это поможет. Я все еще пробую кое-что с ним.

Gino Mortillero 22.05.2019 05:13

Я изолировал случай в новом проекте для меньшего количества кода, похоже, все еще происходит.

Gino Mortillero 22.05.2019 05:43

Я дал вам еще одно простое решение, и вы можете проверить, работает ли оно.

Leo Zhu - MSFT 22.05.2019 07:36
Стоит ли изучать 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
4
231
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я нашел решение. Похоже, что кнопки будут работать только в том случае, если они взяты из контекста элемента ListView.

Поэтому я сделал свойство привязки команды для пользовательского элемента управления A и пользовательского элемента управления B и сделал команду в ViewModel элемента ListView, чтобы открыть Modal. Затем я смог открыть модальное окно с помощью команды.

вы также можете вызвать push-модальную страницу следующим образом (я думаю, она должна указывать стек навигации):

в вашем методе BtnOpen_Clicked:

private async void BtnOpen_Clicked(object sender, EventArgs e)
   {
      await App.Current.MainPage.Navigation.PushModalAsync(new Modal());
   }

Привет, Лео, я отладил и смог получить код здесь, однако, когда я продолжаю, он пытается запустить модальное окно, и это не удается. Нет ошибки, страница просто не открывается. Но я уже смог решить это, см. мой ответ ниже. Спасибо.

Gino Mortillero 22.05.2019 09:33

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