我在使用ElementHost控件托管WPF prism应用程序时遇到问题,并且绝对无法提供帮助。
PRISM应用程序在Silverlight和独立的WPF中运行良好。
主要的Shell似乎在WinForm上的elementHost中设置正常但是其他视图只加载“RegisterViewWithRegion”而不是“Add,Activate”过程。我需要“添加,激活”作为范围。但是我相信问题是我正在加载我的shell两次......不是故意的。我找不到一种方法来调用bootsrapper并设置elementHot而不调用“Resolve”两次。
这是我的WinForm和我的引导程序的代码。使用“RegisterViewWithRegion”时,一切都有效。
这是Winform构造函数:
public Form1()
{
InitializeComponent();
if (System.Windows.Application.Current == null)
{
new MyApp();
}
Bootstrapper bootStrapper = new Bootstrapper();
bootStrapper.Run();
var shellElement = bootStrapper.Container.Resolve<ShellContainer>();
//Attach the WPF control to the host
elementHost.Child = shellElement;
}
这是引导程序:
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<ShellContainer>();
}
protected override void InitializeModules()
{
IModule moduleSurvey = Container.Resolve<SurveyModule>();
moduleSurvey.Initialize();
}
}
答案 0 :(得分:0)
Bootstrapper会自动将Application.Current.MainForm设置为您在CreateShell方法中返回的任何内容。希望您正在设置一个应用程序(我认为这是您在第一个If块中所做的事情)。如果是这样,你可以改变这个:
var shellElement = bootStrapper.Container.Resolve<ShellContainer>();
对此:
var shellElement = Application.Current.MainForm;
这应该有效,但ElementHost肯定存在一些奇怪之处。我们最终遇到了许多奇怪的渲染错误,尤其是在Citrix环境中。我不知道这是否是你设置的限制,但我想我会提到它。
祝你好运!答案 1 :(得分:0)
我有相同的GCE(Gross Conceptual Error)。我在使用“添加”或“激活”时看到我的视图的相同行为被实例化两次。当我遇到它时,我深深地调试了这些行为。
以下是返回ShellContainer的新实例。
var shellElement = bootStrapper.Container.Resolve<ShellContainer>();
使用ContainerControlledLifetimeManager在容器中注册ShellContainer类型,或者在引导程序中放置prublic属性以访问ShellContainer实例以设置为ElementHost。