Области призмы не заполняются при размещении в MFC CView - PullRequest
2 голосов
/ 13 февраля 2012

Мы работаем над новым приложением, которое использует C #, WPF4, Prism4 и MEF. Приложение содержит главное окно оболочки, которое определяет сетку с несколькими разделителями и пятью областями, а также ряд отдельных модулей, которые предоставляют функциональные возможности пользовательского интерфейса в различные области через обнаружение представления и внедрение представления. Все стандартные вещи, ничего экзотического. Приложение очень простое, и все работает нормально, то есть модули правильно передают свои представления в регионы оболочки во время выполнения.

У нас также есть требование разместить ту же оболочку (и пользовательский интерфейс из участвующих модулей) в большом унаследованном приложении MFC. Вот где у нас проблемы. Код взаимодействия WPF / MFC (использующий HwndSource), кажется, работает нормально, о чем свидетельствует тот факт, что оболочка отображается правильно как дочерний элемент родительского MFC CView и имеет базовые функциональные возможности, такие как разделитель сетки, который определен в самой оболочке. , Однако ни одна из областей оболочки не заполняется представлениями, определенными в модулях Prism. Отладка показывает, что модули действительно загружаются, однако экземпляр IRegionManager, который внедряется в каждый модуль, содержит нулевые области, в которые модуль может добавить свои представления. Как будто Prism не знает, что оболочка вообще определяет какие-либо области, следовательно, попытки добавить представления в эти «несуществующие» области заканчиваются неудачей.

Мы получили новый пользовательский класс начальной загрузки, в котором наш код MFC вызывает метод Run (). Этот класс начальной загрузки идентичен его эквиваленту в автономном приложении (которое работает нормально), единственное отличие состоит в том, что мы больше не переопределяем метод InitializeShell (), мы просто полагаемся на реализацию базового класса. Обычно этот метод переопределяется, чтобы установить Application.Current.MainWindow в оболочку и затем показать оболочку, однако в нашем случае нет текущего приложения, потому что мы размещены внутри приложения MFC. Различные попытки переопределить функциональность запуска Bootstrapper, чтобы вернуть управление приложению MFC для отображения оболочки в соответствующее время, не увенчались успехом (в том смысле, что регионы оболочки все еще не заселены, но оболочка все еще отображается).

Кто-нибудь успешно использовал Prism 4 (в частности, заполнил регионы оболочки) в приложении MFC? Будем благодарны за любые советы о том, как разместить оболочку с поддержкой Prism с регионами в MFC CView и заставить приложение MFC инициировать процесс начальной загрузки. Спасибо.

1 Ответ

2 голосов
/ 14 февраля 2012

Хорошо, я понял это. Кропотливо шагая по коду Prism, я наткнулся на метод в RegionManager, который называется OnSetRegionNameCallback (). Этот метод условно вызывает CreateRegion () на основе результата другого вызова метода, IsInDesignMode (). Если мы находимся , а не в режиме разработки, создается область, в противном случае область не создается. Более тщательное изучение IsInDesignMode показало, что для определения того, находимся ли мы в «режиме разработки» или нет, проводятся три отдельных теста, и, если какой-либо из них соответствует действительности, считается, что мы находимся в режиме разработки. Одна из этих проверок была, если Application.Current == ноль. Конечно, в контексте приложения MFC Application.Current действительно имеет значение null, поэтому было решено (ошибочно), что мы были в режиме разработки, и поэтому ни одна область не была создана.

Как только я понял это, дальнейшие поиски в Интернете показали, что ряд других людей столкнулся с той же проблемой. Действительно, в разделе «Призма» CodePlex ( рабочий элемент # 3552 ) есть даже проблема, связанная с этой точной проблемой, возникшей в январе 2009 года. Авторы этого рабочего элемента также предлагают обходной путь создания фиктивное приложение просто чтобы передать "мы в режиме дизайна?" проверять. Пожалуйста, обратитесь к рабочему элементу для более подробной информации. Я реализовал аналогичный обходной путь и смог успешно разместить свою оболочку с поддержкой Prism и ее вспомогательные модули в MFC CView в приложении MFC.

Спасибо тем, кто проложил этот путь до меня, определил и предложил обходной путь. Вы сэкономили мне много времени!

...