Проблемы с Призмой, размещенной в WinForm ElementHost
У меня проблемы с размещением приложения призмы WPF в элементе управления ElementHost, и я не могу помочь.
Приложение PRISM прекрасно работает в Silverlight и в автономном WPF.
Кажется, что основная оболочка нормально настроена в elementHost на WinForm, однако другие представления загружаются только с "RegisterViewWithRegion", а не с процедурой "Add, Activate". Мне нужно "Добавить, активировать" для определения объема. Однако я считаю, что проблема в том, что я загружаю свою оболочку дважды... не специально. Я не могу найти способ вызвать 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 ответа
Загрузчик автоматически устанавливает значение Application.Current.MainForm равным тому, что вы вернули в методе CreateShell. Надеюсь, вы настраиваете приложение (я думаю, это то, что вы делаете в первом блоке If). Если это так, вы можете просто изменить это:
var shellElement = bootStrapper.Container.Resolve<ShellContainer>();
К этому:
var shellElement = Application.Current.MainForm;
Это должно сработать, но с ElementHost определенно есть некоторые странности. Мы закончили с множеством странных ошибок рендеринга, особенно в среде Citrix. Я не знаю, является ли это ограничением вашей настройки, но я подумал, что упомяну это.
Удачи!
У меня был тот же GCE (грубая концептуальная ошибка). Я видел одинаковое поведение моих представлений, создаваемых дважды при использовании Add или Activate. Я был глубоко в отладке поведения, когда он ударил меня.
Далее возвращается новый экземпляр ShellContainer.
var shellElement = bootStrapper.Container.Resolve<ShellContainer>();
Либо зарегистрируйте свой тип ShellContainer в контейнере с помощью ContainerControlledLifetimeManager, либо добавьте свойство prublic в свой загрузчик, чтобы получить доступ к экземпляру ShellContainer для установки в свой ElementHost.