1

我正在为在 Visual Studio .NET 中构建的现有 WinForms 应用程序实现上下文相关帮助。我HelpProvider在表单中添加了一个并将属性设置为一个涵盖表单上每个控件和菜单项HelpNamespace的精彩。.chm我已经HelpKeyword对所有派生的控件进行了必要的设置Control,到目前为止一切都很好:F1 完美运行。

我的问题是我不知道如何为菜单项做这件事。这些使用ToolStripMenuItem类,该类不是派生自Control因此没有HelpKeyword属性。我应该如何为各个菜单项提供上下文相关帮助?谷歌先生一直不太乐观。

4

1 回答 1

5

使用F1不是为菜单项提供帮助的常用方式。菜单项通常使用ToolTip ,或者在状态栏中显示一些帮助文本,或者它们的综合帮助通常带有主页的帮助内容

我更喜欢使用上述解决方案之一,但出于学习目的,我将展示使用HelpRequested表单事件可以做什么。

要处理表单和控件的帮助,您可以依赖HelpRequested表单和控件的事件。

在这里你可以依靠Form事件来解决问题。由于您有一个HelpProvideron 表单,您应该知道在内部HelpProvider处理HelpRequested所有控件的事件,并且对于ShowHelp设置为 的控件true,它设置Handled为并防止事件冒泡,因此如果是true,您将无法使用自定义代码来处理帮助事件。因此,您应该将控件设置为并仅用作帮助密钥持有者。ShowHelptrueShowHelpfalseHelpProvider

要使用表单的事件解决问题HelpRequested,您应该按照以下步骤操作:

  1. 对于ToolStripMenuItems,使用Tag属性作为帮助密钥持有者。
  2. 对于其他控件,如果您使用HelpProvider分配HelpKey,请不要忘记设置ShowHelpfalse
  3. 处理HelpRequested表单的事件。
  4. 在事件处理程序的主体中,检查表单上是否存在活动菜单项,然后使用Tag活动项的属性来显示帮助。如果没有任何活动菜单,请使用ActiveControl表单的属性来显示帮助。

例子

这是一个分步示例,说明如何使用F1键显示菜单项的帮助。为此,请按照下列步骤操作:

  1. 创建表单、菜单和控件- 创建一个Form并放置一些控件以及MenuStrip在表单上包含一些菜单和子菜单。
  2. 配置 HelpProvider -HelpProvider在表单上放置一个控件,并为每个控件分配合适的键到HelpKeyword控件的属性。还将每个控件设置ShowHelp为 false。我们将处理代码中的帮助。
  3. 为菜单配置帮助-ToolStripMenuItem使用它的Tag属性来存储帮助关键字。
  4. 创建一个辅助方法来查找菜单的后代- 向您的应用程序添加一个具有以下代码的类。在下面的代码中,我引入了一个扩展方法来获取 a 的所有ToolStripMenuItemMenuStrip

    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();
        }
    }
    
  5. 处理 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
  • 控件有扩展属性HelpKeywordHelpString请注意您使用的是哪一个,并在HelpRequested事件中获得相同的属性。
  • 不要忘记设置ShowHelp为false。如果您忘记了这一步,该事件将在Helpprovider.
  • 不要忘记为Tag菜单项的属性分配帮助关键字。为了使其对未来更加友好,您可以简单地创建一个扩展器提供程序,将帮助关键字属性添加到菜单项。
于 2017-10-24T02:23:17.937 回答