6

这个问题也发布在Prism 的 Codeplex 网站上

我对按需加载模块有点迷茫,希望你们能不吝赐教。我正在使用v2 #7

这是我想要完成的事情:

1) 我有 2 个区域 - 一个用于实例化模块的按钮 (MenuRegion),另一个用于显示模块 (MainRegion)。在 MenuRegion 中一次只能看到一个模块。
2) 模块位于目录中
3) MenuModule 模块与 MenuRegion 相关联,用于创建显示模块名称的按钮。当单击其中一个按钮时,相应的模块将被加载并显示在 MainRegion 中。
4) 行为:
    a) 单击 ModuleA 按钮并显示 ModuleA。用户在 ModuleA 中输入数据,数据处于未保存状态。
    b) 单击 ModuleB 按钮并显示 ModuleB。用户在 ModuleB 中输入数据,数据处于未保存状态。
    c) 单击 ModuleA 按钮,ModuleA 将显示先前输入的信息。

如果我的假设有误,请纠正我,并请给我其他建议:

1) MainRegion 应该是一个 ContentControl,因此一次只能看到一个模块。
2)我想我需要枚举我的目录的“GrouplessModules”来获取目录中可用模块的 ModuleInfo
3)要加载模块,我认为我需要调用 myModuleManager.LoadModule(moduleName)

最后,我的问题:

1) 我应该在 MenuModuleView 的构造函数中将 moduleManager 作为参数吗?
2) 我如何获取从 MenuModuleView 内部访问的目录,以便枚举可用模块?
3) 在MenuModuleView 中,当我枚举模块时,我创建了按钮,将ModuleInfo 分配给按钮的Tag 属性。这样,我只有一个点击事件来加载模块。它是否正确?对我来说,它闻起来有点变通...

非常感谢你的帮助!!!

4

1 回答 1

7

1) 我应该在 MenuModuleView 的构造函数中将 moduleManager 作为参数吗?

从技术上讲,你可以。但实际上,如果您这样做,您仍然需要为您的视图定义一个默认构造函数。否则,您的视图将不适用于设计师。因此,我建议使用属性将依赖项传递给 UI 组件。

2) 我如何获取从 MenuModuleView 内部访问的目录,以便枚举可用模块?

您将依赖 Prism 的IModuleEnumerator接口,并且依赖注入将负责将模块枚举器提供给您的视图。假设您将 Prism 与 Unity 容器一起使用,则看起来像这样:

[Dependency]
public IModuleEnumerator ModuleEnumerator 
{
    get; set;
}

3) 在MenuModuleView 中,当我枚举模块时,我创建了按钮,将ModuleInfo 分配给按钮的Tag 属性。这样,我只有一个点击事件来加载模块。它是否正确?对我来说,它闻起来有点变通。

我建议您让每个按钮引发相同的 WPF 命令,而是将 分配ModuleInfoButton'CommandParameter属性。同样,Prism 有基础设施来帮助您在复合场景中干净利落地完成此操作。见DelegateCommand课堂。

最后一点,请注意,虽然您可能能够延迟加载模块,但您将无法卸载它们。为此,您将需要AppDomain隔离,这是另一回事。

于 2008-12-19T09:24:30.140 回答