Prism:如何使用 Unity Bootstrapper 在 Shell 区域中加载默认视图
Prism: How to load Default View in Shell Region with Unity Bootstrapper
当我查看 Prism Navigation QuickStart 演示时,它使用 Mef Bootstrapper 并在 [=13= 中使用 IPartImportsSatisfiedNotification
界面] 文件以将默认视图加载到 Shell 区域,如下所示。
[Export]
public partial class Shell : UserControl, IPartImportsSatisfiedNotification
{
...
public void OnImportsSatisfied()
{
this.ModuleManager.LoadModuleCompleted +=
(s, e) =>
{
if (e.ModuleInfo.ModuleName == EmailModuleName)
{
this.RegionManager.RequestNavigate(
RegionNames.MainContentRegion,
InboxViewUri);
}
};
}
}
在我的项目中,我使用 Unity Bootstrapper 并尝试引用此演示来加载默认视图。果不其然,完全不行。
请分享关于“如何使用 Unity Bootstrapper 将默认视图注入 Shell 区域”的建议和建议。
只需将视图添加到视图来源的 Module.Initialize 区域。
假设您的引导程序中有一个 CreateModuleCatalog 覆盖,您可以使用它来将模块添加到目录中。
catalog.AddModule(typeof(YourModule));
在 YourModule Initiaize 覆盖中,注册您想要显示的视图,如下所示。
使用视图发现:
RegionManager.RegisterViewWithRegion("YourRegion", typeof(YourView));
或
使用视图注入(如果你想要更多的控制,或者需要一个范围区域等):
IRegion region = _region_manager.Regions["YourRegion"];
var view = _container.Resolve<YourView>();
region.Add(view, typeof(YourView).FullName);
region.Activate(view);
这种注入方式需要你有region manager的引用,并且你已经在Unity容器中注册了视图,并且你有容器的引用
只要 YourRegion 区域在您的 Shell xaml 中,并且在运行时可见,YourView 就会显示在其中。
Hello World 快速入门也展示了这一点,并使用了 Unity 容器。
https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/HelloWorld
您必须 load/register 您的模块。您可以通过多种方式做到这一点。
Register/Load 代码
在bootstrapper.cs
中:
protected override void ConfigureModuleCatalog()
{
Type ModuleAType = typeof(ModuleAModule);
ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleAType.Name,
ModuleType = moduleAType.AssemblyQualifiedName,
InitializationMode = InitializationMode.WhenAvailable
});
}
Register/Load 来自目录
在bootstrapper.cs
中:
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}
在bin\Debug目录下创建Modules
目录,copy/paste将ModuleA.dll
文件放到该目录下。
在ModuleAModulle.cs
中可以定义模块名称和初始化方法:
[Module(ModuleName="ModuleA", OnDemand=true)]
public class ModuleAModule : IModule
{
public void Initialize()
{
throw new NotImplementedException();
}
}
Register/Load 来自 XAML 文件
将新的资源字典添加到您的 shell 项目并将构建操作设置为资源。 (在这个例子中它被称为 XamlCatalog.xaml
)
<Modularity:ModuleCatalog
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">
<Modularity:ModuleInfo Ref="file://ModuleA.dll" ModuleName="ModuleA" ModuleType="ModuleA.ModuleAModule, ModuleA, Version=1.0.0.0" InitializationMode="WhenAvailable" />
</Modularity:ModuleCatalog>
在bootstrapper.cs
中:
protected override IModuleCatalog CreateModuleCatalog()
{
return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(
new Uri("/ProjectNameHere;component/XamlCatalog.xaml", UriKind.Relative));
}
不要忘记 copy/paste 将 ModuleA.dll
文件放到项目的根目录下,因为您在 XamlCatalog.xaml
文件中引用它。
Register/Load 来自 App.config 文件
在bootstrapper.cs
中:
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}
在'App.config'中:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<modules>
<module assemblyFile="Modules/ProjectNameHere.ModuleA.dll" moduleType="ProjectNameHere.ModuleA.ModuleAModule, ProjectNameHere.ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleA" startupLoaded="true" />
<module assemblyFile="Modules/ProjectNameHere.ModuleB.dll" moduleType="ProjectNameHere.ModuleB.ModuleBModule, ProjectNameHere.ModuleB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleB" startupLoaded="true" />
<module assemblyFile="Modules/ProjectNameHere.ModuleC.dll" moduleType="ProjectNameHere.ModuleC.ModuleCModule, ProjectNameHere.ModuleC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleC" startupLoaded="true" />
</modules>
</configuration>
我从 Prims Introduction course on Pluralsight 那里得到了这些信息。
我遇到过这个问题
如果使用prism.Unity,wpf
可以设置
protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
var factory = base.ConfigureDefaultRegionBehaviors();
factory.AddIfMissing("AutoPopulateExportedViewsBehavior",typeof(AutoPopulateExportedViewsBehavior));
return factory;
}
为 "AutoPopulateExportedViewsBehavior"
添加新的 class 之后
public class AutoPopulateExportedViewsBehavior : RegionBehavior
{
public static string Key {
get;
} = nameof( AutoPopulateExportedViewsBehavior );
protected override void OnAttach()
{
this.Region.ActiveViews.CollectionChanged += this.ActiveViews_CollectionChanged;
}
private void ActiveViews_CollectionChanged( object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e )
{
switch ( e.Action )
{
case NotifyCollectionChangedAction.Add:
Action<IRegionManagerAware> setRegionManager = x => x.RegionManager = this.Region.RegionManager;
MvvmHelpers.ViewAndViewModelAction( e.NewItems[0], setRegionManager );
break;
case NotifyCollectionChangedAction.Remove:
Action<IRegionManagerAware> resetRegionManager = x => x.RegionManager = null;
MvvmHelpers.ViewAndViewModelAction( e.OldItems[0], resetRegionManager );
break;
}
}
}
你需要一个界面来找到 "RegionManager"
public interface IRegionManagerAware
{
IRegionManager RegionManager {
get; set;
}
}
最后,告诉程序你需要一个默认视图,
public class ModulesModule : IModule
{
IRegionManager _regionManager;
IUnityContainer _container;
public ModulesManagementModule( RegionManager regionManager, IUnityContainer container )
{
_regionManager = regionManager;
_container = container;
}
public void Initialize()
{
_container.RegisterTypeForNavigation<ViewA>();
_regionManager.RequestNavigate("ViewA", "ViewA" );
}
}
想法和解决方案来自:
enter link description here
通过本例,您可以获得Navigate的默认视图
当我查看 Prism Navigation QuickStart 演示时,它使用 Mef Bootstrapper 并在 [=13= 中使用 IPartImportsSatisfiedNotification
界面] 文件以将默认视图加载到 Shell 区域,如下所示。
[Export]
public partial class Shell : UserControl, IPartImportsSatisfiedNotification
{
...
public void OnImportsSatisfied()
{
this.ModuleManager.LoadModuleCompleted +=
(s, e) =>
{
if (e.ModuleInfo.ModuleName == EmailModuleName)
{
this.RegionManager.RequestNavigate(
RegionNames.MainContentRegion,
InboxViewUri);
}
};
}
}
在我的项目中,我使用 Unity Bootstrapper 并尝试引用此演示来加载默认视图。果不其然,完全不行。
请分享关于“如何使用 Unity Bootstrapper 将默认视图注入 Shell 区域”的建议和建议。
只需将视图添加到视图来源的 Module.Initialize 区域。
假设您的引导程序中有一个 CreateModuleCatalog 覆盖,您可以使用它来将模块添加到目录中。
catalog.AddModule(typeof(YourModule));
在 YourModule Initiaize 覆盖中,注册您想要显示的视图,如下所示。
使用视图发现:
RegionManager.RegisterViewWithRegion("YourRegion", typeof(YourView));
或
使用视图注入(如果你想要更多的控制,或者需要一个范围区域等):
IRegion region = _region_manager.Regions["YourRegion"];
var view = _container.Resolve<YourView>();
region.Add(view, typeof(YourView).FullName);
region.Activate(view);
这种注入方式需要你有region manager的引用,并且你已经在Unity容器中注册了视图,并且你有容器的引用
只要 YourRegion 区域在您的 Shell xaml 中,并且在运行时可见,YourView 就会显示在其中。
Hello World 快速入门也展示了这一点,并使用了 Unity 容器。
https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/HelloWorld
您必须 load/register 您的模块。您可以通过多种方式做到这一点。
Register/Load 代码
在bootstrapper.cs
中:
protected override void ConfigureModuleCatalog()
{
Type ModuleAType = typeof(ModuleAModule);
ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleAType.Name,
ModuleType = moduleAType.AssemblyQualifiedName,
InitializationMode = InitializationMode.WhenAvailable
});
}
Register/Load 来自目录
在bootstrapper.cs
中:
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}
在bin\Debug目录下创建Modules
目录,copy/paste将ModuleA.dll
文件放到该目录下。
在ModuleAModulle.cs
中可以定义模块名称和初始化方法:
[Module(ModuleName="ModuleA", OnDemand=true)]
public class ModuleAModule : IModule
{
public void Initialize()
{
throw new NotImplementedException();
}
}
Register/Load 来自 XAML 文件
将新的资源字典添加到您的 shell 项目并将构建操作设置为资源。 (在这个例子中它被称为 XamlCatalog.xaml
)
<Modularity:ModuleCatalog
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">
<Modularity:ModuleInfo Ref="file://ModuleA.dll" ModuleName="ModuleA" ModuleType="ModuleA.ModuleAModule, ModuleA, Version=1.0.0.0" InitializationMode="WhenAvailable" />
</Modularity:ModuleCatalog>
在bootstrapper.cs
中:
protected override IModuleCatalog CreateModuleCatalog()
{
return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(
new Uri("/ProjectNameHere;component/XamlCatalog.xaml", UriKind.Relative));
}
不要忘记 copy/paste 将 ModuleA.dll
文件放到项目的根目录下,因为您在 XamlCatalog.xaml
文件中引用它。
Register/Load 来自 App.config 文件
在bootstrapper.cs
中:
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}
在'App.config'中:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<modules>
<module assemblyFile="Modules/ProjectNameHere.ModuleA.dll" moduleType="ProjectNameHere.ModuleA.ModuleAModule, ProjectNameHere.ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleA" startupLoaded="true" />
<module assemblyFile="Modules/ProjectNameHere.ModuleB.dll" moduleType="ProjectNameHere.ModuleB.ModuleBModule, ProjectNameHere.ModuleB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleB" startupLoaded="true" />
<module assemblyFile="Modules/ProjectNameHere.ModuleC.dll" moduleType="ProjectNameHere.ModuleC.ModuleCModule, ProjectNameHere.ModuleC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleC" startupLoaded="true" />
</modules>
</configuration>
我从 Prims Introduction course on Pluralsight 那里得到了这些信息。
我遇到过这个问题 如果使用prism.Unity,wpf
可以设置
protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
var factory = base.ConfigureDefaultRegionBehaviors();
factory.AddIfMissing("AutoPopulateExportedViewsBehavior",typeof(AutoPopulateExportedViewsBehavior));
return factory;
}
为 "AutoPopulateExportedViewsBehavior"
添加新的 class 之后public class AutoPopulateExportedViewsBehavior : RegionBehavior
{
public static string Key {
get;
} = nameof( AutoPopulateExportedViewsBehavior );
protected override void OnAttach()
{
this.Region.ActiveViews.CollectionChanged += this.ActiveViews_CollectionChanged;
}
private void ActiveViews_CollectionChanged( object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e )
{
switch ( e.Action )
{
case NotifyCollectionChangedAction.Add:
Action<IRegionManagerAware> setRegionManager = x => x.RegionManager = this.Region.RegionManager;
MvvmHelpers.ViewAndViewModelAction( e.NewItems[0], setRegionManager );
break;
case NotifyCollectionChangedAction.Remove:
Action<IRegionManagerAware> resetRegionManager = x => x.RegionManager = null;
MvvmHelpers.ViewAndViewModelAction( e.OldItems[0], resetRegionManager );
break;
}
}
}
你需要一个界面来找到 "RegionManager"
public interface IRegionManagerAware
{
IRegionManager RegionManager {
get; set;
}
}
最后,告诉程序你需要一个默认视图,
public class ModulesModule : IModule
{
IRegionManager _regionManager;
IUnityContainer _container;
public ModulesManagementModule( RegionManager regionManager, IUnityContainer container )
{
_regionManager = regionManager;
_container = container;
}
public void Initialize()
{
_container.RegisterTypeForNavigation<ViewA>();
_regionManager.RequestNavigate("ViewA", "ViewA" );
}
}
想法和解决方案来自: enter link description here
通过本例,您可以获得Navigate的默认视图