Xamarin Forms Prism模块中的内容页面正在初始化三次

时间:2018-05-23 19:27:26

标签: xamarin.forms prism-6

我在应用程序中使用Prism用于Xamarin Forms并实现Modularity。我有 .Droid项目,默认PCL项目,其中包含App.xaml 文件和其他内容页面。我有 4个PCL项目,通过实施 IModule 创建为模块。模块在App.xaml.cs中配置。

我的问题是当应用程序初始化时,登录页面,主页在默认PCL项目中正确加载。但是,每次我使用 _navigationService.NavigateAsync("")从其他页面导航到模块时,模块中的任何内容页面都正在初始化三次相同的模块或其他模块。内容页面构造函数与相应的ViewModel构造函数一起被调用三次,但VM中的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();
        }
    }
}

0 个答案:

没有答案