У меня странная проблема, но это может быть потому, что я не понимаю. Я создал 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;
}
}
Привет Лео, я добавил свой код. Дайте мне знать, если это поможет. Я все еще пробую кое-что с ним.
Я изолировал случай в новом проекте для меньшего количества кода, похоже, все еще происходит.
Я дал вам еще одно простое решение, и вы можете проверить, работает ли оно.
Я нашел решение. Похоже, что кнопки будут работать только в том случае, если они взяты из контекста элемента 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());
}
Привет, Лео, я отладил и смог получить код здесь, однако, когда я продолжаю, он пытается запустить модальное окно, и это не удается. Нет ошибки, страница просто не открывается. Но я уже смог решить это, см. мой ответ ниже. Спасибо.
не могли бы вы показать свой код?