![](/img/trans.png)
[英]Good way to add context-sensitive help to an existing Windows Forms application?
[英]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
並防止事件冒泡,因此您無法使用自定義代碼進行處理如果ShowHelp
為true
則幫助事件。 因此,您應該將控件的ShowHelp
設置為false
並將HelpProvider
用作幫助密鑰持有者。
要使用表單的HelpRequested
事件解決問題,您應該按照以下步驟操作:
ToolStripMenuItems
,使用Tag
屬性作為幫助鍵持有者。HelpProvider
分配HelpKey
,請不要忘記將ShowHelp
設置為false
。HelpRequested
事件。Tag
屬性顯示幫助。 如果沒有任何活動菜單,請使用窗體的ActiveControl
屬性來顯示幫助。示例
以下是如何使用F1鍵顯示菜單項幫助的分步示例。 為此,請按照下列步驟操作:
Form
並在Form
放置一些控件和一個帶有一些菜單和子菜單的MenuStrip
。HelpProvider
控件,並為每個控件為控件的HelpKeyword
屬性分配合適的鍵。 ShowHelp
每個控件的ShowHelp
設置為 false。 我們將處理代碼方面的幫助。ToolStripMenuItem
使用其Tag
屬性來存儲幫助關鍵字。 創建一個輔助方法來查找 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(); } }
處理 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
屬性中顯示 helpkeyword。 這意味着解決方案正在運行,之后您可以創建合適的 chm 文件。Help
類的ShowHelp
方法的其他重載之一。HelpKeyword
和HelpString
擴展屬性,注意您使用的是哪一個,並在HelpRequested
事件中獲取相同的屬性。ShowHelp
設置為 false。 如果您忘記了這一步,該事件將在Helpprovider
內部處理。Tag
屬性分配幫助關鍵字。 為了使其對未來更友好,您可以簡單地創建一個擴展程序提供程序,為菜單項添加幫助關鍵字屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.