Могут/как Вы размещаете полную Форму VB6 в приложении C# WPF?

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

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

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

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

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

6
задан jasonk 10 February 2010 в 19:49
поделиться

5 ответов

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

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

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

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

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

    4. Все без исключения ссылки на Me. [Something] должны быть удалены или заменены на UserControl. [Something] , если они применимы.

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

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

  2. Мне не удалось напрямую добавить элемент управления VB6 через взаимодействие в проект WPF. Таким образом, был создан новый проект .Net «Библиотека управления формами Windows». В проект добавлена ​​ссылка на 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. Затем динамически созданный объект управления из приложения winform .Net помещается в тег WindowsFormsHost на xaml, и элемент управления становится видимым в проекте .net, который запускает vb6 UserControl_Show, а затем загружает и отображает форму vb6.

11
ответ дан 8 December 2019 в 16:02
поделиться

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

3
ответ дан 8 December 2019 в 16:02
поделиться

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

1
ответ дан 8 December 2019 в 16:02
поделиться

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

0
ответ дан 8 December 2019 в 16:02
поделиться

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

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

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

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

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

0
ответ дан 8 December 2019 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: