我在SilverLight 4应用程序中使用PRISM。我有一个问题,即某些地区注册的视图无法显示。
在启动时加载模块时,我将一些视图注册到区域,如下所示:
RegionManager.RegisterViewWithRegion("MyRegion1", typeof(IMySubView1));
RegionManager.RegisterViewWithRegion("MyRegion2", typeof(IMySubView2));
我有一个实现名为IMyView的接口的视图,其中xaml有两个内容控件,其中区域在网格中定义,如下所示:
<ContentControl Regions:RegionManager.RegionName="MyRegion1" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="0" Grid.RowSpan="1"/>
<ContentControl Regions:RegionManager.RegionName="MyRegion2" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="1" Grid.RowSpan="1"/>
我尝试了两种不同的方法将视图添加到主区域。两者都添加了视图和基本元素,如按钮显示,但视图中定义的区域不会填充相关的视图。
方法1:
object obj = _container.Resolve<IMyView>();
IRegion mainRegion = _regionManager.Regions["MainViewRegion"];
IRegionManager scoped = mainRegion.Add(obj, "test", true);
mainRegion.Activate(obj);
// Enabling the following call, it will fail saying the region MyRegion1 does not exist. Feels like it should?
// IRegion myRegion = scoped.Regions["MyRegion1"];
方法2:
object obj = _container.Resolve<IMyView>();
_regionManager.AddToRegion("MainViewRegion", obj);
_regionManager.Regions["MainViewRegion"].Activate(obj);
感觉xaml文件中定义的区域没有注册,因此注册的视图不会显示。
MainViewRegion在TabControl中的shell中定义为:
<TabControl Margin="8,0,8,8" Regions:RegionManager.RegionName="MainViewRegion">
任何有关解决我的问题的建议都将不胜感激!
答案 0 :(得分:0)
我面临同样的问题。这个想法是,无论出于何种原因,已经创建的区域的视图注入{mainRegion.Add(obj,“test”,true)}都不显示视图。对我有用的解决方法是从代码创建区域,然后注入视图。像这样:
Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionManager(headerRegionContainer,_RegionManager); Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionName(headerRegionContainer,regionName);
var view = _UnityContainer.Resolve(bag.HeaderViewType); _RegionManager.Regions [regionName]。新增(视图); _RegionManager.Regions [regionName] .Activate(视图);
不幸的是,我无法通过这种方式达到目标,但也许你可以。
此致
利文特
答案 1 :(得分:0)
经过数小时的故障排除后,我找到了一些东西。
在Composite.Presentation \ Regions \ RegionManager.cs中有一个名为IsInDesignMode的方法。当要创建一个区域时,将调用此方法,如果此方法返回true,则不会创建该区域。见下文:
private static void OnSetRegionNameCallback(DependencyObject element, DependencyPropertyChangedEventArgs args)
{
if (!IsInDesignMode(element))
{
CreateRegion(element);
}
}
private static bool IsInDesignMode(DependencyObject element)
{
// Due to a known issue in Cider, GetIsInDesignMode attached property value is not enough to know if it's in design mode.
return DesignerProperties.GetIsInDesignMode(element) || Application.Current == null
|| Application.Current.GetType() == typeof(Application);
}
当我们的silverlight应用程序启动并且shell中的区域被创建时,一切都很好,Application.Current属性的类型为“MyName.Shell.App”。但是当在启动后添加视图时,作为对用户输入的响应,Application.Current类型突然变为“Application”类型,因此IsInDesignMode方法返回true并且不创建区域。
如果我删除Application.Current条件,一切都按预期工作。所以问题是,我的应用程序中有什么问题或者棱镜源代码中有什么问题吗?
答案 2 :(得分:0)
你的_regionManager来自哪里? 你写了一个合适的BootStrapper吗? ? 您需要编写一个继承自MefBootstrapper或UnityBootstrapper的类(如果您不使用那些IoC / Extension框架,则为自定义类),以便在IoC容器中注册所有需要的类型。
你可以发布BootStrapper代码吗?
答案 3 :(得分:0)
问题在Prism 4.0版中消失了,当问题发生时,我正在运行Prism 2.2版。