【问题标题】:How can I activate/deactivate a module's view after its initialization?如何在初始化后激活/停用模块的视图?
【发布时间】:2008-12-11 18:29:41
【问题描述】:

这与 WPF 或 Prism 的复合应用程序指南有关。

我的 shell 中有一个“MainRegion”。我的各种模块将被加载到这个主要区域。我可以在菜单中填充可用模块的列表并选择它们进行加载。在我点击菜单时:

var module = moduleEnumerator.GetModule(moduleName);
moduleLoader.Initialize(new[] { module });

第一次一切正常,因为执行了模块的Initialize()方法,但是在Module1、Module2和Module3初始化后,再次点击加载Module2时没有任何反应。

我的问题:如何在模块的初始化方法执行后按需激活模块?

感谢您的帮助!

【问题讨论】:

    标签: wpf prism modularity cag


    【解决方案1】:

    您实际上并没有激活该模块。您激活区域中的视图。阅读此article

    Initialize 方法只对任何模块调用一次。当您调用 LoadModule 时,您会看到模块中的视图被激活,我猜这是因为 Initilalize 方法正在向区域注册视图。这将激活视图。如果您有多个视图,则最后注册的将是活动视图。

    要激活视图,您需要调用区域的 Activate 方法(假设注入了 IUnityContainer 和 IRegionManager)...

    // Get a view from the container.
    var view = Container.Resolve<MyView>();
    
    // Get the region.
    var region = RegionManager.Regions["MyRegion"];
    
    // Activate the view.
    region.Activate(view);
    

    根据区域控件的类型,这将替换现有的视图或添加到其中。

    【讨论】:

    • 停用怎么样?你有什么建议?
    • 没有真正的停用方法。要“停用”一个视图,您可以激活另一个视图,或者如果您想要的效果是空白区域,则可以激活一个空白视图。
    • ...如果打算隐藏该区域,则折叠该区域。
    【解决方案2】:

    你可以通过调用 Regions 的 Remove 方法来移除一个 View。

    public void RemoveViewFromRegion(string viewName, string regionName, object defaultView)
        {
          IRegion region = regionManager.Regions[regionName];
          object view = region.GetView(viewName);
          region.Remove(view);
          region.Activate(defaultView); 
        }
    

    【讨论】:

      【解决方案3】:

      您应该有一个 ContentControl 作为您的区域。然后,您需要将所有模块添加到该区域。当您单击菜单时,您应该使用该区域的 Activate(...) 方法来激活特定模块。

      【讨论】:

        【解决方案4】:

        这是否意味着当你激活模块时,其他可能被它重叠的模块设置为Visibility.Collapsed?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-21
          • 1970-01-01
          相关资源
          最近更新 更多