棱镜:更改活动视图

时间:2010-05-27 16:13:11

标签: c# wpf prism region

我有一个类似于Windows控制面板的小工具。该工具允许我们管理用户,配置数据库,管理脚本等。 主页显示应用程序的所有子类别。 单击链接时,它会在右侧面板中加载此类别的视图,左侧小面板显示此类别可用的任务。简单。

基本上,我想要做的是拥有一个“上下文”状态栏。如果您处于需要连接的视图中,状态栏应显示状态。如果您在应该显示信息的视图中,我希望它在我的状态栏中。

我已经在我的shell中为状态栏添加了Region(名为 StatusBarRegion 。 对于每个模块,我在shell的区域中注册了该模块的StatusBarView。

现在,我想处理上下文的变化。我需要在适当的时候激活好视图。

但每次我尝试解析 StatusBarRegion 时,都无法在区域经理的区域中找到它。

请参阅,

var region = _regionManager.Regions[.RegionNames.StatusBarRegion];
region.Activate(_container.Resolve<StatusBarView>());

该区域始终为空。为什么?

感谢您的时间。

4 个答案:

答案 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。

为了管理我的状态栏的最佳方式,我仍然想知道我将如何做到这一点。