从 VB 迁移到 C# 的应用程序时遇到的问题和解决方法。
从 VB 迁移到 C# 的应用程序时遇到的问题和解决方法。
引言
在将 VB6 迁移到 C# 的项目中,我发现了一些非常有趣的问题,这些问题是 VB6 环境中内置的功能,但在我们的 C# 应用程序中很难复制相同的功能。
背景
逐渐地,当我们深入研究我们的应用程序时,我们发现了一些非常有趣的问题,这些问题在 VB6 中可以处理,但在我们的 C# Winforms 方面不可用。以下是我要分享的一些问题,因为可能还有其他开发人员需要这些解决方法。
- 在 VB 中,如果我们有两个具有相同快捷键的按钮,它会自动借助 Tab 键来处理,而在 C# Winforms 中,如果我们有两个具有相同快捷键的按钮,它将仅对第一个按钮起作用。
- 在 Windows MDI 应用程序中,如果我们的按钮具有快捷键(Alt + -),例如按钮 &-,VB6 可以处理它并完美运行,而在 C# MDI 应用程序中,它将在左上角打开控制菜单。
- 在 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 日:初始帖子