使用F1不是为菜单项提供帮助的常用方式。菜单项通常使用ToolTip ,或者在状态栏中显示一些帮助文本,或者它们的综合帮助通常带有主页的帮助内容。
我更喜欢使用上述解决方案之一,但出于学习目的,我将展示使用HelpRequested
表单事件可以做什么。
要处理表单和控件的帮助,您可以依赖HelpRequested
表单和控件的事件。
在这里你可以依靠Form
事件来解决问题。由于您有一个HelpProvider
on 表单,您应该知道在内部HelpProvider
处理HelpRequested
所有控件的事件,并且对于ShowHelp
设置为 的控件true
,它设置Handled
为并防止事件冒泡,因此如果是true
,您将无法使用自定义代码来处理帮助事件。因此,您应该将控件设置为并仅用作帮助密钥持有者。ShowHelp
true
ShowHelp
false
HelpProvider
要使用表单的事件解决问题HelpRequested
,您应该按照以下步骤操作:
- 对于
ToolStripMenuItems
,使用Tag
属性作为帮助密钥持有者。
- 对于其他控件,如果您使用
HelpProvider
分配HelpKey
,请不要忘记设置ShowHelp
为false
。
- 处理
HelpRequested
表单的事件。
- 在事件处理程序的主体中,检查表单上是否存在活动菜单项,然后使用
Tag
活动项的属性来显示帮助。如果没有任何活动菜单,请使用ActiveControl
表单的属性来显示帮助。
例子
这是一个分步示例,说明如何使用F1键显示菜单项的帮助。为此,请按照下列步骤操作:
- 创建表单、菜单和控件- 创建一个
Form
并放置一些控件以及MenuStrip
在表单上包含一些菜单和子菜单。
- 配置 HelpProvider -
HelpProvider
在表单上放置一个控件,并为每个控件分配合适的键到HelpKeyword
控件的属性。还将每个控件设置ShowHelp
为 false。我们将处理代码中的帮助。
- 为菜单配置帮助-
ToolStripMenuItem
使用它的Tag
属性来存储帮助关键字。
创建一个辅助方法来查找菜单的后代- 向您的应用程序添加一个具有以下代码的类。在下面的代码中,我引入了一个扩展方法来获取 a 的所有ToolStripMenuItem
子MenuStrip
:
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
public static class ToolStripMenuItemExtensions
{
public static List<ToolStripMenuItem> Descendants(this MenuStrip menu)
{
var items = menu.Items.OfType<ToolStripMenuItem>().ToList();
return items.SelectMany(x => Descendants(x)).Concat(items).ToList();
}
public static List<ToolStripMenuItem> Descendants(this ToolStripMenuItem item)
{
var items = item.DropDownItems.OfType<ToolStripMenuItem>().ToList();
return items.SelectMany(x => Descendants(x)).Concat(items).ToList();
}
}
处理 Helprequested 事件以显示帮助- 处理HelpRequested
表单事件并使用以下代码实现我上面描述的算法:
private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent)
{
string keyword = "";
var selectedMenuItem = this.menuStrip1.Descendants()
.Where(x => x.Selected).FirstOrDefault();
if (selectedMenuItem != null)
keyword = selectedMenuItem.Tag?.ToString();
else if (ActiveControl != null)
keyword = helpProvider1.GetHelpKeyword(ActiveControl);
if (!string.IsNullOrEmpty(keyword))
Help.ShowHelp(this, "Help.chm", HelpNavigator.Index, keyword);
}
笔记
- 为了测试解决方案,您不需要具有索引等的 chm 文件。您可以简单地在
Text
表单属性中显示帮助关键字。这意味着解决方案正在运行,之后您可以创建合适的 chm 文件。
- 您可以根据您的要求使用类
ShowHelp
方法的其他重载之一。Help
- 控件有扩展属性
HelpKeyword
,HelpString
请注意您使用的是哪一个,并在HelpRequested
事件中获得相同的属性。
- 不要忘记设置
ShowHelp
为false。如果您忘记了这一步,该事件将在Helpprovider
.
- 不要忘记为
Tag
菜单项的属性分配帮助关键字。为了使其对未来更加友好,您可以简单地创建一个扩展器提供程序,将帮助关键字属性添加到菜单项。