【问题标题】:Prism modularity reload mechanism棱镜模块化重新加载机制
【发布时间】:2011-08-30 23:02:54
【问题描述】:

我正在尝试实现模块化并且有一些复杂性。我实现了一个名为 ModuleA 的模块,它在其初始化函数中显示新的 childWindow;

public ModuleA()
{
   personViewModel = new PersonViewModel();
   detail = new ViewDetail(personViewModel);
}

public void Initialize()
{
   detail.Show();
}

我的问题是由于错过了重新加载功能的机会,我无法再次显示视图。我的模块按需加载,我的意思是我想在用户单击按钮时加载模块,所以我没有机会在开始时加载模块并从它自己的事件中控制它的功能。然后我尝试像这样从我的应用程序中显示视图;

private void ButtonModelA_Click(object sender, RoutedEventArgs e)
{
   this.moduleManager.LoadModule(MyBootstrapper.ModuleAName);
   ChildWindow detail = new ModuleA.ViewDetail(new ModuleA.ViewModel.PersonViewModel());
   detail.Show();
}

这样就不需要加载模块了。

有没有办法按需加载模块并多次显示其视图?

【问题讨论】:

    标签: silverlight prism modularity


    【解决方案1】:

    我不太确定这在 Silverlight 中是如何工作的,但我认为对 Prism 存在误解。

    Prism 是基于区域的。这意味着应用程序用户界面由状态为区域的 ContentControls(或其他支持区域的控件)组成。区域管理器现在将所有希望驻留在特定区域内的视图添加到该区域中。

    模块只需要告诉区域管理器在特定模块中实现的视图想要驻留在哪个区域内:

    RegionManager.RegisterViewWithRegion( "RegionName", typeof( View ) );
    

    如果特定区域当前不是用户界面的一部分,因为包含承载该区域的控件的视图本身不是用户界面的一部分,因此无法放置想要驻留在该区域内的视图在这个区域内。区域经理只是不知道该区域。要显示视图,您必须手动将承载该区域的控件添加到用户界面。

    另一种方法是手动将特定添加到区域中。使用这种方法,您不必将视图注册到区域管理器。因此,当区域管理器发现该区域时,它保持为空。现在您可以使用区域管理器将视图手动添加到区域中:

    IRegion region = RegionManager.Regions["RegionName"];
    region.Add( new View(), "ViewName" );
    

    如果您想根据任何状态或用户操作将视图放入区域中,您必须手动将其添加到区域中。查看 Stock Trader Reference 实施。它以非常简单的方式解释了如何将视图添加到由用户操作触发的区域。

    【讨论】:

    • 我明白你的意思,我也检查了股票交易员的实施。但是,在这个实现中,模块加载为何时可用并且模块的视图之一注册到主视图。即使我使用区域,我也需要入口注册我的视图,该视图包含在初始化方法旁边的模块中,因为该方法调用了一次。
    • 在我的场景中,我在主视图顶部有按钮,这些按钮不是模块的一部分。当我单击按钮时,我想加载模块并显示视图。直到这里没有问题。但是,当我再次单击按钮时,我无法再次显示我的视图,因为调用了一次初始化方法。我需要按需加载模块并多次到达其内部。
    • 您不必多次初始化模块,因为它们已经初始化。您只需将视图多次添加到一个区域中。
    • 是的,我知道它们已经初始化了。我想将我的视图从模块外部添加到一个区域中。例如,通过已经初始化但如何初始化的模块实例?
    • 用上面的代码。必须从模块内部调用此代码。例如,要将请求放入模块中,您可以使用 EventAggregator。
    猜你喜欢
    • 2012-01-04
    • 2012-01-05
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多