Проблемы с Призмой, размещенной в WinForm ElementHost - PullRequest
0 голосов
/ 20 декабря 2009

У меня проблемы с размещением приложения призмы WPF в элементе управления ElementHost, и я не могу помочь.

Приложение PRISM отлично работает в Silverlight и в автономном WPF.

Кажется, что основная оболочка нормально настроена в elementHost на WinForm, однако другие представления загружаются только с помощью «RegisterViewWithRegion», а не с помощью процедуры «Добавить, активировать». Мне нужно «Добавить, активировать» для определения объема. Однако я считаю, что проблема в том, что я загружаю свою оболочку дважды ... не специально. Я не могу найти способ вызвать 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 голосов
/ 13 июля 2010

У меня был тот же GCE (грубая концептуальная ошибка). Я видел одинаковое поведение моих представлений, создаваемых дважды при использовании Add или Activate. Я был глубоко в отладке поведения, когда он ударил меня.

Следующее возвращает новый экземпляр ShellContainer.

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

Либо зарегистрируйте свой тип ShellContainer в контейнере с помощью ContainerControlledLifetimeManager, либо добавьте свойство prublic в свой загрузчик, чтобы получить доступ к экземпляру ShellContainer для установки в ElementHost.

0 голосов
/ 21 декабря 2009

Bootstrapper автоматически устанавливает Application.Current.MainForm на то, что вы вернули в методе CreateShell. Надеюсь, вы настраиваете приложение (я думаю, это то, что вы делаете в первом блоке If). Если это так, вы можете просто изменить это:

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

К этому:

var shellElement = Application.Current.MainForm;

Это должно сработать, но с ElementHost определенно есть некоторые странности. Мы закончили с множеством странных ошибок рендеринга, особенно в среде Citrix. Я не знаю, является ли это ограничением вашей настройки, но я подумал, что упомяну это.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...