Нужно исправить: невозможно открыть модальное с помощью кнопки внутри пользовательского элемента управления внутри Listview-DataTemplate-ViewCell - PullRequest
0 голосов
/ 21 мая 2019

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

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

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

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

РЕДАКТИРОВАТЬ: После дальнейшей проверки я забыл упомянуть, что [Пользовательский элемент управления B] являетсяэлемент управления, который я связываю для шаблонов элементов списка.Я протестировал снова, просто загружая один [Custom Control B] без просмотра списка, и он смог открыть модальное окно.Однако, когда я помещаю его обратно в представление списка в качестве шаблона элемента, проблема остается.Нужно ли что-то делать, чтобы это можно было запустить?Или это невозможно?

РЕДАКТИРОВАТЬ 2: Сделал новый пример проекта и изолировал кейс, похоже, что он действительно препятствует открытию модала.

[Custom Control A]

<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;
        }


    }

Ответы [ 2 ]

1 голос
/ 22 мая 2019

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

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

private async void BtnOpen_Clicked(object sender, EventArgs e)
   {
      await App.Current.MainPage.Navigation.PushModalAsync(new Modal());
   }
1 голос
/ 22 мая 2019

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

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

...