Страница содержимого в модуле Xamarin Forms Prism инициализируется три раза - PullRequest
0 голосов
/ 23 мая 2018

Я использую Prism для форм Xamarin и реализованную модульность в приложениях.У меня есть .Droid Project, проект по умолчанию PCL, в котором есть файл App.xaml и другие страницы с контентом.И у меня есть 4 проекта PCL , которые создаются как Модули путем реализации IModule .Модули настраиваются в файле App.xaml.cs.

Моя проблема заключается в том, что при инициализации приложения, странице входа в систему, домашней странице, которые в проекте PCL по умолчанию загружены правильно.Но любая страница содержимого в модулях инициализируется ровно три раза каждый раз, когда я переходил на нее, используя _navigationService.NavigateAsync ("") с другой страницы либо из того же модуля, либо из другого модуля.Конструктор страницы содержимого вызывался три раза вместе с соответствующим конструктором ViewModel, но OnNavigationCompleted в виртуальной машине выполняется только один раз.

Может быть, из-за этой проблемы или по какой-то другой причине моей странице контента в модуле требуется еще несколько фракций для полной загрузки.Это можно легко заметить при загрузке.Общая навигация по странице содержимого в модуле не такая плавная.

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

Ниже приведены фрагменты кода моего проекта.

Configure Module in app.xaml.cs

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

            Type module1 = typeof(QNPL.Mobile.Module1);
            Type module2 = typeof(QNPL.Mobile.Module2);
            Type module3 = typeof(QNPL.Mobile.Module3);
            Type module4 = typeof(QNPL.Mobile.Module4);

            ModuleCatalog.AddModule(
              new ModuleInfo()
              {
                  ModuleName = module1.Name,
                  ModuleType = module1,
                  InitializationMode = InitializationMode.OnDemand
              });

            ModuleCatalog.AddModule(
              new ModuleInfo()
              {
                  ModuleName = module2.Name,
                  ModuleType = module2,
                  InitializationMode = InitializationMode.OnDemand
              });

            ModuleCatalog.AddModule(
              new ModuleInfo()
              {
                  ModuleName = module3.Name,
                  ModuleType = module3,
                  InitializationMode = InitializationMode.OnDemand
              });

            ModuleCatalog.AddModule(
              new ModuleInfo()
              {
                  ModuleName = module4.Name,
                  ModuleType = module4,
                  InitializationMode = InitializationMode.OnDemand
              });
        }

private async void MenuItemClick(object value)
{
    if (value != null)
    {
        MenuDetail menuItem = (MenuDetail)value;
        SelectedMenu = menuItem;

        if (!string.IsNullOrEmpty(SelectedMenu.ModuleName))
        {
            _moduleManager.LoadModule(SelectedMenu.ModuleName);
        }

        await _navigationService.NavigateAsync(SelectedMenu.URL, navParams);
    }
}


Module Page:
using Microsoft.Practices.Unity;
using Prism.Modularity;
using Prism.Unity;
using QNPL.Mobile.Module1.API;
using QNPL.Mobile.Module1.Views;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace QNPL.Mobile.Module1
{
    public class Module1 : IModule
    {
        private readonly IUnityContainer _unityContainer;
        public Module1(IUnityContainer unityContainer)
        {
            _unityContainer = unityContainer;
        }

        public void Initialize()
        {
            _unityContainer.RegisterTypeForNavigation<Module1HomePage>();

            _unityContainer.RegisterPopupNavigationService();

            _unityContainer.RegisterType<IApiInterface, ApiInterface>();
        }
    }
}

Content Page in Module1:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="QNPL.Mobile.Module1.Views.Module1HomePage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
    xmlns:prismBehaviors="clr-namespace:Prism.Behaviors;assembly=Prism.Forms"
    x:Name="Module1HomePage"
    Title="Home Page"
    prism:ViewModelLocator.AutowireViewModel="True">
    <ContentPage.Content>
    </ContentPage.Content>
</ContentPage>


ContentPage .cs file:

using Xamarin.Forms;

namespace QNPL.Mobile.Module1.Views
{
    public partial class Module1HomePage : ContentPage
    {
        public Module1HomePage()
        {
            InitializeComponent();
        }
    }
}
...