在WinForm ElementHost中托管Prism的问题

时间:2009-12-20 12:30:27

标签: wpf winforms prism bootstrapper elementhost

我在使用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();

    }
}

2 个答案:

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