Можно / как разместить полную форму VB6 в приложении C # WPF? - PullRequest
6 голосов
/ 10 февраля 2010

В настоящее время я изучаю возможность переноса некоторых старых приложений VB6 в WPF с C #. На первом этапе планируется портировать несколько ключевых форм, а не все приложения. Теоретическая цель - открыть форму VB6 в каком-либо контейнере в WPF через DLL ActiveX.

Это вообще возможно? Я попытался взглянуть на Interop и не могу найти надежного примера того, как заставить его работать с чем-либо, кроме элементов управления Win32, а не с полной формой. У меня есть полный доступ к старому коду VB6, и я могу изменить его в любом случае.

Следующий скриншот основного приложения WPF будет служить оболочкой / контейнером:

http://www.evocommand.com/junk_delete_me/main_menu_mockup.png

Текущий экран обслуживания VB6, который будет загружен в разделе «пустое пространство» с правой стороны предыдущего экрана.

Ответы [ 5 ]

11 голосов
/ 26 февраля 2010

Мне удалось выполнить задачу, выполнив следующие шаги:

  1. Создан новый проект VB6 Active X Control. Скопировал и вставил все содержимое элементов управления VB6 и код в новый элемент управления. При переключении на элемент управления необходимо обработать несколько элементов:

    1. вы теряете способность отображать заголовок формы в предыдущая манера Вы можете обойти это с альтернативными элементами управления (label / borderlesstextbox и т. д.), выполнить ту же функциональность, если необходимо. Это не было приоритетом с каждый экран был размещен в браузер как система вкладок в нашем новом .Net проект.

    2. Все ссылки на указатели мыши должны быть изменен с Me.Mousepointer на Screen.mousepointer

    3. Вы не можете использовать Me.Hide и должны альтернативные события, чтобы скрыть .Net контейнер.

    4. Любые и все ссылки на Я. [Что-нибудь] должны быть удалены или заменен на UserControl. [что-нибудь] если они применимы.

    5. Если вы используете какие-либо функции, которые ссылка [yourcontrol] .Contianer.Property на формы они должны быть изменены на цикл через UserControl.Controls вместо сбора и «Контейнер» недопустимо для элементов управления ActiveX vb6

    6. Все немодальные формы / диалоговые окна должны быть удалены из проекта как теперь нет никакого Hwnd для обработки в WPF. Вы получаете ошибку «Немодальные формы не может быть отображено на этом хосте приложение из ActiveX DLL, Элемент управления ActiveX или страница свойств ». В нашем случае у нас был простой всплеск экран, который будет отображаться при определенном длинные процессы / отчеты отображаются на сообщите пользователю, что запущено.

  2. Мне не удалось напрямую добавить элемент управления VB6 с помощью взаимодействия в проект WPF. Таким образом, был создан новый проект .Net «Windows Form Control Library». Ссылка на VB6 OCX была добавлена ​​в проект. Затем элементы управления VB6 были добавлены в набор инструментов .Net с помощью «щелчка правой кнопкой мыши» -> «Добавить элемент» и указания ссылки на com-ссылку на ocx элемента управления VB6. Элемент управления .Net затем использовался для размещения / обслуживания элемента управления VB6.

  3. Чтобы отобразить форму хоста в VB6 и заставить ее запускать необходимые функции инициализации, элементы управления VB6 OCX были установлены по умолчанию в Visible.False, поэтому они изначально были добавлены в .Net OCX как невидимые элементы управления. При необходимости для элемента управления VB6 устанавливается значение visible = True, которое запускает событие UserControl_Show (). Весь код ранее в Form_Load () был перемещен в это событие. Событие show было самым простым способом доступа к Form_Load по мере необходимости. MSDN: «Элемент управления не получает события Show, если форма скрыта, а затем снова показана или если форма свернута и затем восстановлена. Во время этих операций окно элемента управления остается в форме, и его свойство Visible не изменяется. ”

  4. Обертывание элементов управления vb6 в элементе управления .Net Winform решило проблему с отображением кнопок Radio / Option в черном цвете, как указано в другом месте в одном из моих ответов на этот вопрос, без необходимости преобразования кадров в графические блоки, как было предложено ,

  5. В приложении WPF в качестве выбора меню выбран код xaml, который динамически создается и отображается через оболочку с тегом WindowsFormsHost. Динамически созданный объект элемента управления из приложения .Net winform затем помещается в тег WindowsFormsHost на xaml, и элемент управления становится видимым в проекте .net, который запускает vb6 UserControl_Show, а затем загружает и отображает форму vb6.

3 голосов
/ 11 февраля 2010

Я думаю, что вам нужно будет извлечь содержимое формы VB6 в элемент управления ActiveX. Затем вы можете выставить это в вашей ActiveX DLL и поместить это в форму WPF. Я сомневаюсь, что возможно разместить форму VB6 в любой другой форме.

1 голос
/ 10 февраля 2010

Можете ли вы даже загрузить эту форму VB6 в другую форму VB6? Я предлагаю, чтобы вы сначала сработали.

0 голосов
/ 12 февраля 2010

На данный момент я нашел способ сделать то, что было нужно в WinForms, а не в WPF. http://www.codeproject.com/KB/vb-interop/VB6formsinNET.aspx Я полагаю, что если я смогу заставить его работать на 100%, я могу перенести его на WPF или, в худшем случае, разместить элемент WinForm в форме WPF, если он у меня тоже есть ( U-G-L-Y ).

В любом случае, я стал немного ближе, но у меня возникла очень странная проблема с некоторыми элементами управления, рисующими и экран. Кнопки радио / опции отображаются черным цветом:

http://www.evocommand.com/junk_delete_me/optionbuttons.png

Я попытался явно изменить цвет фона элементов управления с кнопки на фиксированный цвет, и он все еще делает это. Я предполагаю, что это проблема многоуровневости с кнопками выбора, находящимися в элементе управления кадром. Я немного растерялся из-за того, как действовать без масштабной переделки контента VB6, чтобы поменять кнопки настроек на флажки. Это здоровенное приложение, и в приложении есть более 600 элементов управления кнопками, с которыми я не хочу иметь дело.

EDIT: Я смог подтвердить, что это как-то связано с наложением параметра в элементе управления Frame. Если вытащить в базовую форму, проблема не возникает: http://www.evocommand.com/junk_delete_me/optionbuttons2.png

0 голосов
/ 11 февраля 2010

Не существует надежного способа установить родителя формы VB6. Вы всегда можете взломать его или использовать простой элемент управления ActiveX (UserControl в VB6) в качестве контейнера пользовательского интерфейса вместо форм VB6.

...