簡體   English   中英

Windows 窗體中菜單項的上下文相關幫助

[英]Context-sensitive help for menu items in Windows Forms

我正在為在 Visual Studio .NET 中構建的現有 WinForms 應用程序實現上下文相關幫助。 我在表單中添加了一個HelpProvider ,並將HelpNamespace屬性設置為一個美妙的.chm ,它涵蓋了表單上的每個控件和菜單項。 我已經在從Control派生的所有控件上設置了必要的HelpKeyword ,到目前為止一切都很好:F1 完美運行。

我的問題是我不知道如何為菜單項做到這一點。 它們使用ToolStripMenuItem類,該類不是從Control派生的,因此沒有HelpKeyword屬性。 我應該如何為單個菜單項提供上下文相關的幫助? 谷歌先生一直不太熱情。

使用F1不是為菜單項提供幫助的常用方法。 菜單項通常使用ToolTip ,或者在StatusBar 中顯示一些幫助文本,或者它們的綜合幫助通常帶有主頁的幫助內容

我更喜歡使用上述解決方案之一,但出於學習目的,我將展示您可以使用表單的HelpRequested事件執行的操作。

要處理窗體和控件的幫助,您可以依賴窗體和控件的HelpRequested事件。

這里可以依靠Form事件來解決問題。 由於您在表單上有一個HelpProvider ,您應該知道HelpProvider在內部處理所有控件的HelpRequested事件,對於將ShowHelp設置為true控件,它將Handled設置為true並防止事件冒泡,因此您無法使用自定義代碼進行處理如果ShowHelptrue則幫助事件。 因此,您應該將控件的ShowHelp設置為false並將HelpProvider用作幫助密鑰持有者。

要使用表單的HelpRequested事件解決問題,您應該按照以下步驟操作:

  1. 對於ToolStripMenuItems ,使用Tag屬性作為幫助鍵持有者。
  2. 對於其他控件,如果您使用HelpProvider分配HelpKey ,請不要忘記將ShowHelp設置為false
  3. 處理表單的HelpRequested事件。
  4. 在事件處理程序的主體中,檢查表單上是否有活動菜單項,然后使用活動項的Tag屬性顯示幫助。 如果沒有任何活動菜單,請使用窗體的ActiveControl屬性來顯示幫助。

示例

以下是如何使用F1鍵顯示菜單項幫助的分步示例。 為此,請按照下列步驟操作:

  1. 創建窗體、菜單和控件- 創建一個Form並在Form放置一些控件和一個帶有一些菜單和子菜單的MenuStrip
  2. 配置 HelpProvider - 在表單上放置一個HelpProvider控件,並為每個控件為控件的HelpKeyword屬性分配合適的鍵。 ShowHelp每個控件的ShowHelp設置為 false。 我們將處理代碼方面的幫助。
  3. 為菜單配置幫助- 對於ToolStripMenuItem使用其Tag屬性來存儲幫助關鍵字。
  4. 創建一個輔助方法來查找 Menu 的后代- 將一個類添加到您的應用程序中,該類具有以下代碼。 在下面的代碼中,我引入了一個擴展方法來獲取MenuStrip所有子ToolStripMenuItem

     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屬性中顯示 helpkeyword。 這意味着解決方案正在運行,之后您可以創建合適的 chm 文件。
  • 您可以根據需要使用Help類的ShowHelp方法的其他重載之一。
  • 控件有HelpKeywordHelpString擴展屬性,注意您使用的是哪一個,並在HelpRequested事件中獲取相同的屬性。
  • 不要忘記將ShowHelp設置為 false。 如果您忘記了這一步,該事件將在Helpprovider內部處理。
  • 不要忘記為菜單項的Tag屬性分配幫助關鍵字。 為了使其對未來更友好,您可以簡單地創建一個擴展程序提供程序,為菜單項添加幫助關鍵字屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM