Xamarin.forms Xamarin Forms Prism模块中的内容页正在初始化三次
我正在使用Prism实现Xamarin表单,并在应用程序中实现模块化。我有.Droid项目,默认的PCL项目,它有App.xaml文件和其他内容页。我有4个PCL项目,通过实施IModule创建为模块。模块在App.xaml.cs中配置 我的问题是当应用程序初始化时,默认PCL项目中的登录页、主页加载正确。但是,每次我从同一模块或其他模块的另一个页面使用\u navigationService.NavigateAsync(“”)导航到模块中的任何内容页时,模块中的任何内容页都会初始化三次。内容页构造函数与相应的ViewModel构造函数一起被调用了三次,但VM中的OnNavigationCompleted只运行了一次 可能是因为这个问题或其他原因,模块中我的内容页需要再加载几个分数。这在加载时很容易被注意到。模块中内容页的整体导航不太顺畅 有什么解决办法吗?我已经尝试过保留一个空内容 在没有任何控件的模块页面中,结果相同 下面是我的项目的代码片段Xamarin.forms Xamarin Forms Prism模块中的内容页正在初始化三次,xamarin.forms,prism-6,Xamarin.forms,Prism 6,我正在使用Prism实现Xamarin表单,并在应用程序中实现模块化。我有.Droid项目,默认的PCL项目,它有App.xaml文件和其他内容页。我有4个PCL项目,通过实施IModule创建为模块。模块在App.xaml.cs中配置 我的问题是当应用程序初始化时,默认PCL项目中的登录页、主页加载正确。但是,每次我从同一模块或其他模块的另一个页面使用\u navigationService.NavigateAsync(“”)导航到模块中的任何内容页时,模块中的任何内容页都会初始化三次。内容页
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();
}
}
}
在app.xaml.cs中配置模块
受保护的覆盖无效配置ModuleCatalog()
{
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(
新模块info()
{
ModuleName=module1.Name,
ModuleType=module1,
InitializationMode=InitializationMode.OnDemand
});
ModuleCatalog.AddModule(
新模块info()
{
ModuleName=module2.Name,
ModuleType=module2,
InitializationMode=InitializationMode.OnDemand
});
ModuleCatalog.AddModule(
新模块info()
{
ModuleName=module3.Name,
ModuleType=module3,
InitializationMode=InitializationMode.OnDemand
});
ModuleCatalog.AddModule(
新模块info()
{
ModuleName=module4.Name,
ModuleType=module4,
InitializationMode=InitializationMode.OnDemand
});
}
专用异步void菜单项单击(对象值)
{
if(值!=null)
{
MenuDetail menuItem=(MenuDetail)值;
SelectedMenu=menuItem;
如果(!string.IsNullOrEmpty(SelectedMenu.ModuleName))
{
_moduleManager.LoadModule(SelectedMenu.ModuleName);
}
wait_navigationService.NavigateAsync(SelectedMenu.URL,navParams);
}
}
模块页面:
使用Microsoft.Practices.Unity;
模块化;
使用棱镜。统一;
使用QNPL.Mobile.Module1.API;
使用QNPL.Mobile.Module1.Views;
使用Xamarin.Forms;
使用Xamarin.Forms.Xaml;
[程序集:XamlCompilation(XamlCompilationOptions.Compile)]
命名空间QNPL.Mobile.Module1
{
公共类模块1:IModule
{
私有只读IUnityContainer\u unityContainer;
公共模块1(IUnityContainer unityContainer)
{
_unityContainer=unityContainer;
}
公共无效初始化()
{
_unityContainer.RegisterTypeForNavigation();
_unityContainer.RegisterPopupNavigationService();
_unityContainer.RegisterType();
}
}
}
模块1中的内容页:
ContentPage.cs文件:
使用Xamarin.Forms;
命名空间QNPL.Mobile.Module1.Views
{
公共部分类模块1主页:内容页
{
公共模块1主页()
{
初始化组件();
}
}
}
无论如何,您可以将此信息发布到回购协议中,以查看它吗?没有完整的设置图片,因为我认为缺少一些内容。您使用的是什么prism容器?你为什么用棱镜6?你加入了懒散小组吗?prism开发者和更广泛的社区在这个群体中非常活跃和有帮助。我使用下面的软件包。