我目前正在探索使用 C# 将一些较旧的 VB6 应用程序移植到 WPF 的选项。第一阶段的计划是移植几个关键表格而不是所有应用程序。理论上的目标是通过 ActiveX dll 在 WPF 内的某种容器中打开 VB6 表单。

这有可能吗?
我试过查看互操作,但似乎找不到一个可靠的例子来说明如何让它与 Win32 控件以外的任何东西一起工作,而不是一个完整的形式。我可以完全访问旧的 VB6 代码,并且可以根据需要对其进行修改。

主 WPF 应用程序的以下屏幕截图将用作包装器/容器:

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

当前 VB6 维护屏幕将加载到前一个屏幕右侧的“空白”部分。

最佳答案

我能够通过以下步骤完成任务:

  • 创建了一个新的 VB6 Active X 控件项目。将 VB6 窗体控件的全部内容和代码复制并粘贴到新控件中。在切换到控件时必须处理几个元素:
  • 你失去了显示能力
    表格中的标题
    以前的方式。你可以解决
    它带有备用控件
    (标签/无边框文本框等)
    完成相同的功能,如果
    需要。这不是优先事项,因为
    每个屏幕都被托管在一个
    浏览器就像我们新的标签系统
    .Net 项目。
  • 所有鼠标指针引用必须
    从 Me.Mousepointer 更改为
    Screen.mousepointer
  • 你不能使用 Me.Hide 并且必须
    隐藏 .Net 的备用事件
    容器。
  • 任何和所有对
    我.[任何东西] 必须被移除或
    替换为 UserControl.[anything]
    如果它们适用。
  • 如果您使用任何函数
    引用一个
    [yourcontrol].Contianer.Property 上
    他们将需要更改为的形式
    通过 UserControl.Controls 循环
    取而代之的是集合,而“容器”是
    对 vb6 ActiveX 控件无效
  • 所有非模态表单/对话框
    必须从项目中删除
    现在没有 Hwnd 在 WPF 中处理。
    您收到“非模态表单”的错误消息
    无法在此主机中显示
    来自 ActiveX DLL 的应用程序,
    ActiveX 控件或属性页”。
    在我们的例子中,我们有一个简单的飞溅
    确定时会显示的屏幕
    显示的长流程/报告
    让用户知道正在运行什么。
  • 我无法通过互操作将 VB6 控件直接添加到 WPF 项目。因此,创建了一个新的 .Net“Windows 窗体控件库”项目。对 VB6 OCX 的引用已添加到项目中。然后通过“右键单击”->“添加项目”并指向对 VB6 控件 ocx 的 com 引用,将 VB6 控件添加到 .Net 工具箱中。然后使用 .Net 控件来托管/提供 VB6 控件。
  • 为了在 VB6 中显示宿主窗体并让它触发必要的初始化功能,VB6 OCX 控件默认为 Visible.False 方式,因此它们最初作为不可见控件添加到 .Net OCX 中。需要时,VB6 控件设置为visible = True,这会触发UserControl_Show() 事件。以前在 Form_Load() 中的所有代码都移到了这个事件中。 show 事件是根据需要访问 Form_Load 的最简单方法。 MSDN:“如果窗体被隐藏然后再次显示,或者如果窗体被最小化然后恢复,则控件不会接收 Show 事件。在这些操作期间,控件的窗口保留在窗体上,并且其 Visible 属性不会改变。”
  • 将 vb6 控件包装在 .Net Winform 控件中解决了单选/选项按钮呈现为黑色的问题,如我对此问题的一个回答中概述的其他地方所述,而无需按照建议将框架转换为图片框。
  • 在 WPF 应用程序中,作为选择菜单选项的 xaml 代码是通过带有 WindowsFormsHost 标记的包装器动态创建和显示的。然后,将来自 .Net winform 应用程序的动态创建的控件对象推送到 xaml 上的 WindowsFormsHost 标记中,并使控件在触发 vb6 UserControl_Show 的 .net 项目上可见,然后加载和显示 vb6 表单。
  • 关于c# - 您可以/如何在 C# WPF 应用程序中托管完整的 VB6 表单?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2239845/

    10-13 06:46