我有一个类似于Windows控制面板的小工具。该工具允许我们管理用户,配置数据库,管理脚本等。 主页显示应用程序的所有子类别。 单击链接时,它会在右侧面板中加载此类别的视图,左侧小面板显示此类别可用的任务。简单。
基本上,我想要做的是拥有一个“上下文”状态栏。如果您处于需要连接的视图中,状态栏应显示状态。如果您在应该显示信息的视图中,我希望它在我的状态栏中。
我已经在我的shell中为状态栏添加了Region
(名为 StatusBarRegion 。
对于每个模块,我在shell的区域中注册了该模块的StatusBarView。
现在,我想处理上下文的变化。我需要在适当的时候激活好视图。
但每次我尝试解析 StatusBarRegion 时,都无法在区域经理的区域中找到它。
请参阅,
var region = _regionManager.Regions[.RegionNames.StatusBarRegion];
region.Activate(_container.Resolve<StatusBarView>());
该区域始终为空。为什么?
感谢您的时间。
答案 0 :(得分:3)
我相信你的错误与
有关region.Activate(_container.Resolve<StatusBarView>());
而不是
var region = _regionManager.Regions[.RegionNames.StatusBarRegion];
为什么这可能是你的问题有几个原因,我会给你解决方案。
首先,region.Activate()
要求视图实例已存在于该区域中。因此,从您的代码中,我怀疑_container.Resolve<StatusBarView>()
正在为您提供StatusBarView
的新实例,因此不会存在于该地区。
解决方案:当您向容器注册StatusBarView
时,请考虑单例视图。
_container.RegisterType<IStatusBarView,StatusBarView>
(new ContainerControlledLifetimeManager())
其次,您必须先注册视图类型(或手动添加)才能激活它。
解决方案:
_regionManager.RegisterViewWithRegion
(RegionNames.StatusBarRegion, typeof(IStatusBarView));
可替换地:
_regionManager.Regions[RegionNames.StatusBarRegion]
.Add(_container.Resolve<StatusBarView>());
答案 1 :(得分:1)
如果已经与shell中的区域目标相同,请仔细检查RegionNames.StatusBarRegion
值。
如果确实如此,我认为region不应该为null,除非你把你的句柄放在你的view / viewmodel模块中,你没有在构造函数上获得区域管理器和容器。
让我们在您的观点SilverlightUserControl1
中说明。构造函数可能是这样的:
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _container;
public SilverlightUserControl1(IRegionManager regionManager, IUnityContainer container)
{
_regionManager = regionManager;
_container = container;
}
private Button1_Click(object sender, RoutedEventArgs e)
{
var statusBarView = _container.Resolve<StatusBarView>();
statusBarRegion = _regionManager.Regions["StatusBarRegion"];
statusBarRegion.Add(statusBarView, "StatusBarView");
statusBarRegion.Activate(statusBarView);
// or you could remove all views in `ActiveViews` and add the view then
// (no need to activate)
}
答案 2 :(得分:1)
我前段时间遇到过类似的问题。我发布了一个问题here,但随后找出了问题及其解决方案。
我的问题是我的地区没有在Shell
中定义。查看full question and answer here。
我希望这会有所帮助。
答案 3 :(得分:0)
该地区为空的原因是什么? 这段代码位于模块的 Initialize 方法中,因此尚未创建UI。
为了管理我的状态栏的最佳方式,我仍然想知道我将如何做到这一点。