2010-05-27 86 views
5

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

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

我已经把Region(名为StatusBarRegion状态栏在我的壳。 对于每个模块,我注册这个模块的StatusBarView外壳上的区域。

现在,我要处理的语境的改变。我需要激活视野良好时,它的时间。

但每次我试图解决StatusBarRegion,不能在大区经理的区域找到。

请参阅:

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

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

谢谢你的时间。

回答

0

区域为空的原因是什么? 这段代码是在初始化方法的模块,所以用户界面还没有创建。

为了最好的方式来管理我的状态栏,我仍然想知道我将如何去做。

+0

根据PRISM团队的说法,模块初始化将在shell初始化后发生。看到这里:http://msdn.microsoft.com/en-us/library/gg430868(v=pandp.40).aspx所以你的假设,没有被创建的用户界面,我相信是不正确的。 – 2010-12-16 23:04:46

1

双重检查RegionNames.StatusBarRegion如果您的shell中的区域目标已经相同,则该值为。

如果是这样,区域不应该为空我认为,除了把你的句柄放在你的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) 
} 
+0

谢谢你的时间,它已被赞赏。 但正如我之前所说,该区域为空,因为代码是在模块的Initialize方法中,所以UI尚未创建,因此该区域无法解析。 这就是说,你的答案给出了使用区域的正确方式的一个很好的例子。再次感谢。 – esylvestre 2010-06-03 15:55:00

+0

使用'RemoveAll()'去激活和激活视图,然后添加所需的视图是否有优势?谢谢。 – 2017-03-24 14:20:01

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

我也曾有过类似的问题而回。我发布了一个问题here,但后来发现问题及其解决方案。

我的问题是我的区域没有在Shell中定义。查看full question and answer here

我希望这会有所帮助。