65.9K
CodeProject 正在变化。 阅读更多。
Home

从 VB 迁移到 C# 的应用程序时遇到的问题和解决方法。

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.44/5 (5投票s)

2009年4月21日

CPOL

2分钟阅读

viewsIcon

20808

从 VB 迁移到 C# 的应用程序时遇到的问题和解决方法。

引言

在将 VB6 迁移到 C# 的项目中,我发现了一些非常有趣的问题,这些问题是 VB6 环境中内置的功能,但在我们的 C# 应用程序中很难复制相同的功能。

背景

逐渐地,当我们深入研究我们的应用程序时,我们发现了一些非常有趣的问题,这些问题在 VB6 中可以处理,但在我们的 C# Winforms 方面不可用。以下是我要分享的一些问题,因为可能还有其他开发人员需要这些解决方法。

  1. 在 VB 中,如果我们有两个具有相同快捷键的按钮,它会自动借助 Tab 键来处理,而在 C# Winforms 中,如果我们有两个具有相同快捷键的按钮,它将仅对第一个按钮起作用。
  2. 在 Windows MDI 应用程序中,如果我们的按钮具有快捷键(Alt + -),例如按钮 &-,VB6 可以处理它并完美运行,而在 C# MDI 应用程序中,它将在左上角打开控制菜单。
  3. 在 MDI 应用程序中,如果我们使用 MenuStrip,并且我们已将一些 menuItem 设置为其 MDIWindowListItem 属性,以便它应在此菜单项下显示当前激活的子窗体,在 VB 中,一旦打开任何子窗体,它就会将标题文本添加到此 MenuItem 列表,即使在更改子窗体的标题后,它也会反映到 MenuItem 列表中(即,它会刷新自身以显示子窗体的当前标题)。 在 C# MDI 应用程序的情况下,我们必须处理此功能,以便它应显示激活的子窗体的最新标题。

Using the Code

为了处理前两个问题,我们有救星 ProcessCmdKey,通常在我们的 VB 应用程序中,最多只有两个按钮存在此类问题(具有相同的快捷键)。 因此,为了解决这个问题,我以这种方式编写了我的解决方法。 这里我们有两个按钮 button1 & button2 具有相同的快捷键 Alt + A。

 /// <summary>
 /// Handle the Same Shortcut Keys on form.
 /// </summary>
 private const Keys ShortCutKeysWithAlt = Keys.Alt | Keys.A;
 private bool _isFocusOnFirstButton = false;
  protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  {
     if (keyData == ShortCutKeysWithAlt)
       {
         if (_isFocusOnFirstButton)
           {
              button1.Focus();
              _isFocusOnFirstButton = false;
           }
         else
           {
              button2.Focus();
              _isFocusOnFirstButton = true;
           }
            return true;
       }
     else
       {
          return base.ProcessCmdKey(ref msg, keyData);
       }
  }

使用相同的 ProcessCmdKey,我们可以轻松处理第二个问题。 我们只需要添加一小段代码。

/// <summary>
/// Handle the Same Shortcut Keys on form.
/// </summary>

private const Keys ShortCutKeysWithAlt = Keys.Alt | Keys.OemMinus;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == ShortCutKeysWithAlt)
    {
        button.PerformClick();
        return true;
    }
    else
    {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

为了解决第三个问题,我们必须将 DropDownOpening 事件添加到菜单项,该菜单项是 MenuStrip 控件的 MDIWindowList 项。 在 if 块之后,我们在这里纠正了另一个问题,该问题是 C# 中当我们打开任何子窗体时,其标题会添加到 Window 菜单中,并且当我们关闭子窗体时,它会在该菜单项下留下一个分隔符,这是 VB 应用程序内置的处理方式。 为了处理这个问题,我们必须手动从菜单项的末尾删除此 ToolStripSeperator

/// <summary>
/// mnuWindow_DropDownOpening event
/// </summary>
/// <param name=""sender""></param>
/// <param name=""e""></param>
void mnuWindow_DropDownOpening(object sender, EventArgs e)
{
    if (this.ActiveMdiChild != null)
    {
        Form activeChild = this.ActiveMdiChild;
        ActivateMdiChild(null);
        ActivateMdiChild(activeChild);
    }

    if (mnuWindow.DropDownItems[mnuWindow.DropDownItems.Count - 1] is        
          System.Windows.Forms.ToolStripSeparator)
    {
         mnuWindow.DropDownItems.RemoveAt(mnuWindow.DropDownItems.Count - 1);
    }
}

在从事此迁移项目时,我将不断添加我的经验。 如果有人有相同类型的有趣问题及其解决方法的经验,请与我分享。

历史

  • 2009 年 4 月 21 日:初始帖子
© . All rights reserved.