Итак, у меня есть код, который я должен преобразовать в MAUI из XAMARIN. Вопрос в том, что я написал код, который как бы делает свою страницу с информацией. Все функции информационной части работают нормально. Проблема в том, что когда предполагается открыть страницу, заполненную информацией, в основном страница не открывается. В версии XAMARIN мы создали NavigationManager для навигации по страницам. Всякий раз, когда он подходит к методу навигации, он говорит, что он нулевой. Я не первый раз сталкиваюсь с этой проблемой. Когда я впервые столкнулся с этой проблемой, я загрузил пакет NuGet NavigatableElement, который поставляется с Microsoft.Maui.Controls. И вот как я это исправил сначала:
private async void DataPacketsButton_Clicked(object sender, EventArgs e)
{
//This is the old version that I used the NavigationManager That I have Created.
//var manageDataPacketsPage = new ManageDataPacketsPage();
//await NavigationManager.Instance.Navigation.PushAsync(manageDataPacketsPage, true);
//This is the method that I used the NuGet Package NavigatableElement.
await Navigation.PushAsync(new ManageDataPacketsPage());
}
Это тот, который я пытаюсь преобразовать в NavigatableElement:
public async Task OpenParcelPage(string plotId)
{
var page = new ParcelPage();
page.Fill(plotId);
//This does not see the NavigatableElement Package. So its returning the "Navigation" Object null.
await NavigationManager.Instance.Navigation.PushAsync(page);
}
Это NavigationManager, который я создал:
public class NavigationManager
{
public INavigation Navigation { get; private set; }
#region Singleton
private static readonly object _lock = new object();
private static readonly object _updateLock = new object();
private static NavigationManager instance = null;
public static NavigationManager Instance
{
get
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new NavigationManager();
}
}
}
return instance;
}
}
Как я могу решить эту проблему?
В качестве альтернативы, с помощью INaviagtion
, вы можете написать свой собственный сервис просмотра для навигации по страницам.
Вот фрагмент кода для справки при переходе с первой страницы на вторую:
public static class ViewServices
{
private static IServiceCollection Services;
public static MauiAppBuilder UseViewServices(this MauiAppBuilder builder)
{
Services = builder.Services;
return builder;
}
public static ContentPage ResolvePage<TService>(params object[] inputParameters)
{
var implementationType = Services
.Where(service => service.ServiceType == typeof(TService) && service.ImplementationType != null)
.Select(service => service.ImplementationType)
.First();
return (Activator.CreateInstance(implementationType, inputParameters)) as ContentPage;
}
}
public interface IFirstPage
{
}
public interface ISecondPage
{
}
ISecondPage
public partial class FirstPage : ContentPage,IFirstPage
{
public FirstPage()
{
InitializeComponent();
BindingContext = new FirstPageViewModel(this.Navigation);
}
}
Первая страница.xaml:
<VerticalStackLayout>
<Label
Text = "Welcome to .NET MAUI!"
VerticalOptions = "Center"
HorizontalOptions = "Center" />
<Button
Text = "Take me to 2nd Page"
Command = "{Binding NavigateToSecondPageCommand}" />
</VerticalStackLayout>
public partial class FirstPageViewModel
{
private INavigation _navigationService;
public FirstPageViewModel(INavigation navigation)
{
this._navigationService= navigation;
}
[RelayCommand]
async void NavigateToSecondPage()
{
await _navigationService.PushAsync(ViewServices.ResolvePage<ISecondPage>());
}
}
5. В App.xaml.cs измените начальную страницу, как показано ниже:
MainPage = new NavigationPage(ViewServices.ResolvePage<IFirstPage>());
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
})
//don't forget adding the view service
.UseViewServices();
builder.Services.AddSingleton<IFirstPage, FirstPage>();
builder.Services.AddTransient<ISecondPage, SecondPage>();
return builder.Build();
}
Причина, по которой диспетчер навигации возвращал значение null, заключалась в том, что я не реализовал это на главной странице.
public MainPage()
{
InitializeComponent();
//This is the one.
NavigationManager.Instance.SetNavigation(Navigation);
}
Я знаю, что не так много людей делают свой собственный менеджер навигации. То, что я должен сделать, на самом деле прочитать и сделать, как Александр сказал мне выше. Но если кто-то наткнется на эту проблему, они могут исправить это следующим образом.
Добавьте в вопрос код, устанавливающий свойство навигации. Кроме того, хотя это и не является причиной проблемы, вы можете просто установить экземпляр в «статическом конструкторе». Тогда замок не нужен. Или установите его встроенным в объявление поля.