【问题标题】:Prism v4/MVVM (Unity/WPF) - Load Modules into the same RegionPrism v4/MVVM (Unity/WPF) - 将模块加载到同一区域
【发布时间】:2010-12-13 16:11:13
【问题描述】:

我在一个项目中工作,我在 Shell 中声明了两个部分;其中之一用于放置菜单,其项目将按需加载模块,另一个将用于加载所请求模块的视图。

这是一个外壳设计的例子

    <StackPanel Orientation="Vertical" Grid.Column="0" Grid.Row="1">
        <Button Content="Home" Height="23" Name="Home" Width="75"/>
        <Button Content="Users" Height="23" Name="Users" Width="75"/>
    </StackPanel>
    <Border Grid.Column="1" Grid.Row="1" Background="WhiteSmoke">
        <ContentControl cal:RegionManager.RegionName="MainRegion" Name="MainRegion"/>
    </Border>

如您所见,“菜单”由按钮系列(这仅用于测试)和一个 ContentControl 组成,就像我需要加载视图的区域一样。

这是一个如何在我的引导程序中添加模块的示例:

    protected override void ConfigureModuleCatalog()
    {
        base.ConfigureModuleCatalog();

        System.Type homeModule = typeof(FieldCollection.Home.HomeModule);
        ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
        moduleCatalog.AddModule(new ModuleInfo() { ModuleName = homeModule.Name, ModuleType = homeModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand });

        System.Type userModule = typeof(FieldCollection.User.UserModule);
        moduleCatalog.AddModule(new ModuleInfo() { ModuleName = userModule.Name, ModuleType = userModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand });

    }

这是模块的初始化方法:

    public void Initialize()
    {
        this.container.RegisterType<IUserController, UserController>(new ContainerControlledLifetimeManager());
        this.regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.UserSummaryView));

    }

最后这就是从菜单中调用模块的方式。

    private void User_Click(object sender, RoutedEventArgs e)
    {
        moduleManager.LoadModule("UserModule");
    }

问题是区域中只显示第一个调用的视图。我正在使用 Prism 4 和 Unity,例如依赖注入容器

感谢您的帮助

【问题讨论】:

    标签: wpf prism


    【解决方案1】:

    ContentControl 只能包含一个项目,如果您希望在同一区域内显示多个项目,请使用ItemsControl

    LoadModule(String) 只会调用模块的IModule.Initialize() 方法一次并在此时激活它。请记住,加载模块和查看模块不是一回事。因此,如果您再次调用LoadModule(String),它将不会激活视图。模块和视图不是 1:1 的关系。一个模块可以有多个与之关联的视图。

    你可以做的就是打电话

    IRegionManager.Regions["MainRegion"].Activate(T);
    

    ...其中T 是您要显示的视图的一个实例。

    【讨论】:

    • 好的,但是当我使用 ItemsControl 时,所有模块都显示在同一区域中,我希望一次只显示一个模块。感谢您的回答
    猜你喜欢
    • 2011-04-16
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2011-02-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多