我所做的是在我的 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;
}
}
现在我有两件事:
- 我可以用来在我的 shell 中创建菜单的 ViewStore。
- 一种模块打开其他模块拥有的视图的方法,而无需耦合超出简单的 ModuleDependencies(实际上,即使 ModuleDependency 也不是必需的,但可能是正确的。
显然,这种方式过于简单化了。我有一些东西表明视图是否应该是菜单项。我的应用程序有几个菜单等,但这是基础知识,应该可以帮助您。
另外,你应该给 Stackoverflow 一点机会来给你一个答案……你在放弃之前只给了我们 3 个小时 :)
希望这可以帮助。