0

我在 ElementHost 控件中托管 WPF prism 应用程序时遇到问题,迫切需要帮助。

PRISM 应用程序在 silverlight 和独立 WPF 中运行良好。

主 Shell 似乎在 WinForm 上的 elementHost 中设置得很好,但是其他视图只加载“RegisterViewWithRegion”而不是“Add,Activate”过程。我需要“添加,激活”来确定范围。但是我相信问题是我加载了我的 shell 两次……不是故意的。如果不调用两次“Resolve”,我找不到调用引导程序并设置 elementHot 的方法。

这是我的 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();

    }
}
4

2 回答 2

0

我有相同的 GCE(总概念错误)。在使用 Add 或 Activate 时,我看到我的视图被实例化了两次。当它击中我时,我正在深入调试这些行为。

以下是返回 ShellContainer 的新实例。

var shellElement = bootStrapper.Container.Resolve<ShellContainer>();

使用 ContainerControlledLifetimeManager 在容器中注册您的 ShellContainer 类型,或者在您的引导程序上放置一个 prublic 属性以访问 ShellContainer 实例以设置到您的 ElementHost。

于 2010-07-13T12:48:07.613 回答
0

Bootstrapper 会自动将 Application.Current.MainForm 设置为您在 CreateShell 方法中返回的任何内容。希望您正在设置一个应用程序(我认为这就是您在第一个 If 块中所做的)。如果是这样,你可以改变这个:

var shellElement = bootStrapper.Container.Resolve<ShellContainer>();

对此:

var shellElement = Application.Current.MainForm;

这应该可行,但 ElementHost 肯定有一些奇怪之处。我们最终遇到了很多奇怪的渲染错误,尤其是在 Citrix 环境中。我不知道这是否是您设置的限制,但我想我会提到它。

祝你好运!

于 2009-12-21T14:33:21.230 回答