来自MSDN:
模块中的大多数视图可能不必直接显示,而是仅在用户执行某些操作后才能显示。根据应用程序的样式,您可能希望使用菜单,工具栏或其他导航策略供用户访问视图。在模块的初始化方法中,您还可以注册应用程序的导航结构。在导航结构的事件处理程序中(即,当用户单击菜单项时),您可以使用View Injection技术将视图添加到适当的区域。
我有一个类似的场景,我正在使用RegisterViewWithRegion在Module的Initialization方法中向Region添加Views。我想用菜单(这是一个不同的模块)显示基于视图的用户交互。
如何在不破坏棱镜中模块的解耦行为的情况下实现此行为?
是否可以激活/显示已添加到某个区域的视图,例如ModuleA中的ModuleA?
答案 0 :(得分:2)
我所做的是使用以下界面在我的Shell中创建一个视图注册表(我在这里简化):
public interface IViewRegistry
{
void RegisterView(string title, string key, Func<UIElement> viewCreationMethod);
void OpenView(string key);
}
这是过于简单化的方式,但希望这会给你一张照片。每个模块在初始化时使用此接口向shell注册其视图。在我的shell中,我创建了一个存储这些东西的ViewStore。
public static class ViewStore
{
public Dictionary<string, ViewEntry> Views { get; set; }
static ViewStore()
{
Views = new Dictionary<string, ViewEntry>();
}
public void RegisterView(string name, string key, Func<UIElement> createMethod)
{
Views.Add(key, new ViewEntry() { Name = name, CreateMethod = createMethod });
}
}
然后从我的IViewRegistry实现:
public class ViewRegistryService : IViewRegistry
{
public void RegisterView(string title, string key, Func<UIElement> createMethod)
{
ViewStore.RegisterView(title, key, createMethod);
}
public void OpenView(string key)
{
//Check here with your region manager to see if
//the view is already open, if not, inject it
var view = _regionManager.Regions["MyRegion"].GetView(key);
if(view != null)
{
view = ViewStore.Views[key]();
_regionManager.Regions["MyRegion"].Add(view, key);
}
_regionManager.Regions["MyRegion"].Activate(view);
}
private IRegionManager _regionManager;
public ViewRegistryService(IRegionManager rm)
{
_regionManager = rm;
}
}
现在我有两件事:
显然这种方式过于简单化了。我有东西表明视图是否应该是一个菜单项。我的应用程序有几个菜单等,但这是基础知识,应该让你去。
另外,你应该给Stackoverflow一点机会给你一个答案......你只给了我们3个小时才放弃:)
希望这有帮助。
答案 1 :(得分:0)
RegisterViewWithRegion没有接受View name作为参数的重载。这可以简化模块的集成。我在Codeplex
中添加了一个工作项目前我正在添加对其他视图注入模块的引用,并且失去了Prism的松散耦合性