3

当我查看Prism Navigation QuickStart 演示时,它使用Mef Bootstrapper并使用文件中的IPartImportsSatisfiedNotification接口Shell.xaml.cs将默认视图加载到 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 区域”的建议和一些建议。

4

4 回答 4

4

假设您的引导程序中有一个 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);

这种注入方法需要你有一个对区域管理器的引用,并且你已经将视图注册到了 Unity 容器中,并且你有一个对容器的引用

只要 YourRegion 区域在您的 Shell xaml 中,并且在运行时可见,YourView 就会显示在其中。

Hello World 快速入门也显示了这一点,并使用了 Unity 容器。

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/HelloWorld

于 2016-01-03T00:36:12.300 回答
3

只需将视图添加到您的 Module.Initialize 视图所在的区域中。

于 2016-01-02T20:57:02.260 回答
2

我也遇到过这个问题如果你用prism.Unity,wpf

你可以设置

protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
    var factory = base.ConfigureDefaultRegionBehaviors();
    factory.AddIfMissing("AutoPopulateExportedViewsBehavior",typeof(AutoPopulateExportedViewsBehavior));
    return factory;
}

在为“AutoPopulateExportedViewsBehavior”添加新类之后

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;
    }
}

最后,告诉程序你需要一个默认视图,</p>

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" );
    }
}

想法和解决方案来自: 在此处输入链接描述

通过这个例子,可以得到 Navigate 的默认视图

于 2017-05-12T10:31:57.487 回答
0

您必须加载/注册您的模块。您可以通过多种方式做到这一点。

注册/加载代码

bootstrapper.cs

protected override void ConfigureModuleCatalog() 
{
    Type ModuleAType = typeof(ModuleAModule);
    ModuleCatalog.AddModule(new ModuleInfo()
    {
        ModuleName = moduleAType.Name,
        ModuleType = moduleAType.AssemblyQualifiedName,
        InitializationMode = InitializationMode.WhenAvailable
    });
}

从目录注册/加载

bootstrapper.cs

protected override IModuleCatalog CreateModuleCatalog() 
{
    return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}

在 bin\Debug 目录中创建Modules目录并将ModuleA.dll文件复制/粘贴到此目录。

ModuleAModulle.cs你可以定义模块名称和初始化方法:

[Module(ModuleName="ModuleA", OnDemand=true)]
public class ModuleAModule : IModule 
{
    public void Initialize()
    {
        throw new NotImplementedException();
    }
}

从 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));
}

不要忘记将ModuleA.dll文件复制/粘贴到项目的根目录,因为您在XamlCatalog.xaml文件中引用它。

从 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>

我从 Pluralsight 的Prims Introduction 课程中获得了这些信息。

于 2017-02-16T13:30:42.503 回答