我们使用RoboHelp并生成chm文件,有时也称为HTML帮助文件。.NET Framework的Help
类有一个方法ShowHelp
,您可以调用它,并传递chm文件和要显示的主题。您可以按主题标题、ID等方式进行显示。我们使用主题标题进行显示,因此调用看起来像这样:
System.Windows.Forms.Help.ShowHelp(null, "Help/ExiaProcess.chm", HelpNavigator.Topic, helpTopic);
接下来,您可以创建一个名为HelpProvider的类,该类创建了一个名为HelpTopic的附加属性。这使您可以将HelpTopic属性附加到任何FrameworkElement上。该类还使用静态构造函数将内置的F1帮助命令挂钩到命令处理程序上,以从源中检索附加属性并打开帮助文档。
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
public class HelpProvider
{
#region Fields
public static readonly DependencyProperty HelpTopicProperty =
DependencyProperty.RegisterAttached("HelpTopic", typeof(string), typeof(HelpProvider));
#endregion Fields
#region Constructors
static HelpProvider()
{
CommandManager.RegisterClassCommandBinding(
typeof(FrameworkElement),
new CommandBinding(
ApplicationCommands.Help,
new ExecutedRoutedEventHandler(ShowHelpExecuted),
new CanExecuteRoutedEventHandler(ShowHelpCanExecute)));
}
#endregion Constructors
#region Methods
public static string GetHelpTopic(DependencyObject obj)
{
return (string)obj.GetValue(HelpTopicProperty);
}
public static void SetHelpTopic(DependencyObject obj, string value)
{
obj.SetValue(HelpTopicProperty, value);
}
public static void ShowHelpTableOfContents()
{
System.Windows.Forms.Help.ShowHelp(null, "Help/ExiaProcess.chm", HelpNavigator.TableOfContents);
}
public static void ShowHelpTopic(string helpTopic)
{
if (helpTopic.IndexOf(".") == helpTopic.Length - 1)
helpTopic = helpTopic.Substring(0, helpTopic.Length - 1);
helpTopic = helpTopic.Replace(" ", "_").Replace("\\", "_").Replace("/", "_").Replace(":", "_").Replace("*", "_").Replace("?", "_").Replace("\"", "_").Replace(">", "_").Replace("<", "_").Replace("|", "_") + (helpTopic.IndexOf(".htm") == -1 ? ".htm" : "");
System.Windows.Forms.Help.ShowHelp(null, "Help/ExiaProcess.chm", HelpNavigator.Topic, helpTopic);
}
private static void ShowHelpCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
FrameworkElement senderElement = sender as FrameworkElement;
if (HelpProvider.GetHelpTopic(senderElement) != null)
e.CanExecute = true;
}
private static void ShowHelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
ShowHelpTopic(HelpProvider.GetHelpTopic(sender as FrameworkElement));
}
#endregion Methods
}
有了这个设置,你可以像这样从代码中调用帮助文档:
private void HelpButton_Click(object sender, RoutedEventArgs e)
{
Help.HelpProvider.ShowHelpTopic("License Key Dialog");
}
更好的是,现在您可以像这样将帮助附加到 UI 中的任何 FrameworkElement,
<Window name="MainWin"
...
...
xmlns:help="clr-namespace:ExiaProcess.UI.Help"
...
...
help:HelpProvider.HelpTopic="Welcome to YourApp" />
...
...
<TextBox help:HelpProvider.HelpTopic="Bug Title" />
...
...
<ComboBox help:HelpProvider.HelpTopic="User Drop Down"/>
...
现在当用户在Windows或任何元素上按F1时,他们将获得上下文相关的帮助。