我正在为Visual Studio .NET中构建的现有WinForms应用程序实现上下文相关帮助。我在表单中添加了HelpProvider
,并将HelpNamespace
属性设置为一个精彩的.chm
,它涵盖了表单上的每个控件和菜单项。我已经为HelpKeyword
派生的所有控件设置了必要的Control
,到目前为止一切都很棒:F1完美运行。
我的问题是我无法弄清楚如何为菜单项做这件事。这些使用ToolStripMenuItem
类,它不是从Control
派生的,因此没有HelpKeyword
属性。我应该如何为单个菜单项提供上下文相关帮助?谷歌先生并非即将到来。
答案 0 :(得分:4)
使用 F1 不是为菜单项提供帮助的常用方法。菜单项通常使用工具提示,或在 StatusBar 中显示一些帮助文本,或者通常他们的综合帮助附带主页的帮助内容。
我更喜欢使用上述解决方案之一,但为了学习目的,我将展示使用表单的HelpRequested
事件可以做些什么。
要处理表单和控件的帮助,您可以依赖表单和控件的HelpRequested
事件。
在这里,您可以依靠Form
事件来解决问题。由于您在表单上有HelpProvider
,因此您应该知道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
控件,并为每个控件分配适当的键到HelpKeyword
控件属性。同时将每个控件的ShowHelp
设置为false。我们将处理代码帮助。ToolStripMenuItem
使用Tag
属性存储帮助关键字。 创建辅助方法以查找菜单的后代 - 使用以下代码向您的应用程序添加类。在以下代码中,我介绍了一种扩展方法,以获取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);
}
注意
Text
属性中显示帮助关键字即可。这意味着解决方案正在运行,之后您可以创建合适的chm文件。Help.ShowHelp
的其他重载之一。HelpKeyword
和HelpString
扩展属性,请注意您使用的是哪一个,并在HelpRequested
事件中获得相同的属性。ShowHelp
设为false。如果您忘记了此步骤,则会在Helpprovider
内部处理该事件。Tag
属性分配帮助关键字。为了使其对未来更加友好,您可以简单地创建一个扩展程序提供程序,为菜单项添加帮助关键字属性。