我在PRISM中實現應用程序,需要從dll文件動態導入模塊。 我設法做到了 - 他們正在導入,但我無法顯示它。 我決定創建一個特殊的模塊來封裝它 - 讓我們稱之爲ModuleDock。 因此,我們有這樣的事情:在棱鏡模塊內顯示棱鏡模塊
Bootstrapper.cs:
class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
}
protected override IModuleCatalog CreateModuleCatalog()
{
var modules = new DirectoryModuleCatalog
{
LoadSubdirectories = true,
ModulePath = @"C:\Modules"
};
modules.AddModule(typeof(ModuleDockModule));
return modules;
}
}
Shell.xaml:
<ContentControl regions:RegionManager.RegionName="ModuleDockModule" />
ModuleDockModule.cs(在ModuleDock項目):
public class ModuleDockModule : IModule
{
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _unityContainer;
public void Initialize()
{
RegisterIoc();
if (_regionManager.Regions.ContainsRegionWithName("ModuleDockModule"))
{
_regionManager.RegisterViewWithRegion("ModuleDockModule", typeof(ModuleDockView));
}
}
public ModuleDockModule(IRegionManager regionManager, IUnityContainer unityContainer, IRegionViewRegistry regionViewRegistry)
{
_regionManager = regionManager;
_unityContainer = unityContainer;
}
private void RegisterIoc()
{
_unityContainer.RegisterType<IModuleDockView, ModuleDockView>();
_unityContainer.RegisterType<IModuleDockViewModel, ModuleDockViewModel>();
}
}
和加載模塊的最後一個:
[Module(ModuleName = "TestModule", OnDemand = false)]
public class TestModuleModule : IModule
{
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _unityContainer;
public void Initialize()
{
RegisterIoc();
if (_regionManager.Regions.ContainsRegionWithName("TestModule"))
{
_regionManager.RegisterViewWithRegion("TestModule", typeof(TestView));
}
}
public TestModuleModule(IRegionManager regionManager, IUnityContainer unityContainer)
{
_regionManager = regionManager;
_unityContainer = unityContainer;
}
private void RegisterIoc()
{
_unityContainer.RegisterType<ITestView, TestView>();
_unityContainer.RegisterType<ITestViewModel, TestViewModel>();
}
}
出於測試目的,我創建了行XAML的:
<ContentControl regions:RegionManager.RegionName="TestModule" />
你能告訴我,爲什麼這行顯示TestModule在Shell.xaml ,但不要在ModuleDockView.xaml中顯示它?
請記住,在最後階段,我必須使用不同的號碼通過我的平臺的其他用戶提供的未知的模塊,所以我不能做任何事情靜態(如模塊名稱或初始化)。 提前謝謝!
爲了確認,你問爲什麼TestModule不ModuleDockView顯示,而是在外殼?這將取決於您在哪個Xaml頁面中使用內容Control定義該區域。關於靜態初始化,它們將在每個模塊內進行。所以你不需要擔心這一點。我認爲做一個枚舉類定義的默認RegionNames其中每個人都知道他們的。 – GOstrowsky
@GOstrowsky - no。TestModule沒有顯示在ModuleDockView中 - 但我知道加載它的一切都是正確的,因爲如果我將相同的區域放在Shell.xaml中,並將其從ModuleDockView.xaml中移除(出於測試目的),它就會顯示出來。 從其他方面 - 我使用的類與靜態字符串的區域名稱,但對於堆棧我爲了更好的可讀性使用文本值的示例。 – Zozo
謝謝你的解釋。問題將出現在Module的加載順序上,因爲*** TestModule ***依賴於*** ModuleDockModule ***區域的*** ModuleDockModule ***。你可以檢查*** TestModule ***是否正在初始化*** ModuleDockModule ***之前?如果是這樣,那麼您需要在模塊名稱屬性下添加一個依賴項屬性到*** TestModuleModule ***類中,作爲** [ModuleDependency(「ModuleDockModule」)] **。問候。 – GOstrowsky