在 WPF 应用程序中集成帮助

Posted

技术标签:

【中文标题】在 WPF 应用程序中集成帮助【英文标题】:Integrating help in a WPF application 【发布时间】:2011-07-04 05:46:19 【问题描述】:

在 WPF 应用程序中集成本地(而不是在线)帮助的可能方法是什么?它更像是一本手册,但我想以某种方式整合它。

编辑:刚刚找到http://wordtoxaml.codeplex.com,我会试试那个。它将 word 文档转换为 xaml,我可以在 WPF 中显示。

编辑 2:我找到了一个可行的解决方案:用 word 编写手册,另存为 XPS,然后使用 https://web.archive.org/web/20111116005415/http://www.umutluoglu.com/english/post/2008/12/20/Showing-XPS-Documents-with-DocumentViewer-Control-in-WPF.aspx 显示它

【问题讨论】:

我必须创建它,但我更喜欢 html 您的编辑 2 链接错误 【参考方案1】:

我们使用 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;

/// <summary>
/// Provider class for online help.  
/// </summary>
public class HelpProvider

    #region Fields

    /// <summary>
    /// Help topic dependency property. 
    /// </summary>
    /// <remarks>This property can be attached to an object such as a form or a textbox, and 
    /// can be retrieved when the user presses F1 and used to display context sensitive help.</remarks>
    public static readonly DependencyProperty HelpTopicProperty = 
        DependencyProperty.RegisterAttached("HelpTopic", typeof(string), typeof(HelpProvider));

    #endregion Fields

    #region Constructors

    /// <summary>
    /// Static constructor that adds a command binding to Application.Help, binding it to 
    /// the CanExecute and Executed methods of this class. 
    /// </summary>
    /// <remarks>With this in place, when the user presses F1 our help will be invoked.</remarks>
    static HelpProvider()
    
        CommandManager.RegisterClassCommandBinding(
            typeof(FrameworkElement),
            new CommandBinding(
                ApplicationCommands.Help,
                new ExecutedRoutedEventHandler(ShowHelpExecuted),
                new CanExecuteRoutedEventHandler(ShowHelpCanExecute)));
    

    #endregion Constructors

    #region Methods

    /// <summary>
    /// Getter for <see cref="HelpTopicProperty"/>. Get a help topic that's attached to an object. 
    /// </summary>
    /// <param name="obj">The object that the help topic is attached to.</param>
    /// <returns>The help topic.</returns>
    public static string GetHelpTopic(DependencyObject obj)
    
        return (string)obj.GetValue(HelpTopicProperty);
    

    /// <summary>
    /// Setter for <see cref="HelpTopicProperty"/>. Attach a help topic value to an object. 
    /// </summary>
    /// <param name="obj">The object to which to attach the help topic.</param>
    /// <param name="value">The value of the help topic.</param>
    public static void SetHelpTopic(DependencyObject obj, string value)
    
        obj.SetValue(HelpTopicProperty, value);
    

    /// <summary>
    /// Show help table of contents. 
    /// </summary>
    public static void ShowHelpTableOfContents()
    
        System.Windows.Forms.Help.ShowHelp(null, "Help/ExiaProcess.chm", HelpNavigator.TableOfContents);
    

    /// <summary>
    /// Show a help topic in the online CHM style help. 
    /// </summary>
    /// <param name="helpTopic">The help topic to show. This must match exactly with the name 
    /// of one of the help topic's .htm files, without the .htm extention and with spaces instead of underscores
    /// in the name. For instance, to display the help topic "This_is_my_topic.htm", pass the string "This is my topic".</param>
    /// <remarks>You can also pass in the help topic with the underscore replacement already done. You can also 
    /// add the .htm extension. 
    /// Certain characters other than spaces are replaced by underscores in RoboHelp help topic names. 
    /// This method does not yet account for all those replacements, so if you really need to find a help topic
    /// with one or more of those characters, do the underscore replacement before passing the topic.</remarks>
    public static void ShowHelpTopic(string helpTopic)
    
        // Strip off trailing period.
        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);
    

    /// <summary>
    /// Whether the F1 help command can execute. 
    /// </summary>
    private static void ShowHelpCanExecute(object sender, CanExecuteRoutedEventArgs e)
    
        FrameworkElement senderElement = sender as FrameworkElement;

        if (HelpProvider.GetHelpTopic(senderElement) != null)
            e.CanExecute = true;
    

    /// <summary>
    /// Execute the F1 help command. 
    /// </summary>
    /// <remarks>Calls ShowHelpTopic to show the help topic attached to the framework element that's the 
    /// source of the call.</remarks>
    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"/>
    ...

现在,当用户在窗口或任何元素上按 F1 时,他们将获得上下文相关的帮助。

【讨论】:

对于其他阅读本文的人,我建议使用 Nigel 的课程和 Microsoft HTML Help Workshop 来创建您的帮助。这是一个非常简单且非常好的功能。观看this 以获取有关如何创建 .chm 文件的说明。谢谢奈杰尔。 附加属性HelpTopicProperty的名称应该是HelpTopic,而不是HelpString。 这不是针对 Windows 窗体的答案吗 - 而不是 WPF?【参考方案2】:

我也有类似的需求,只是我只需要将 F1 键连接到我们现有的帮助代码。

我最终提取了大约 5 个不同的 *** 页面,所以我把它放在这里以防其他人有类似的需求。

在我的 MainWindow.xaml 中,我在 inputBindings 中添加了一个 KeyBinding 以将 F1 连接到 ICommand:

<Window.InputBindings>
    (other bindings here...)
    <KeyBinding Key="F1" Command="Binding Path=ShowHelpCommand"/>
</Window.InputBindings>

然后在我的 MainWindowViewModel.cs 中添加了这个调用我现有帮助代码的 ICommand。

    private ICommand _showHelpCommand;
    public ICommand ShowHelpCommand
    
        get
        
            return _showHelpCommand ??
                   (_showHelpCommand = new RelayCommand(p => DisplayCREHelp(), p => true));
        
    

我希望这对遇到类似问题的人有所帮助。

【讨论】:

我很感兴趣,但我不确定我是否关注你。 RelayCommand()DisplayCREHelp() 是什么? @InteXX: RelayCommand() 是一个 .Net 对象,而 DisplayCREHelp() 是我在该表单上按下 F1 时要调用的方法的名称。基本上,您可以使用 ICommand 和 RelayCommand 将键盘上的功能键连接到应用程序中的方法。

以上是关于在 WPF 应用程序中集成帮助的主要内容,如果未能解决你的问题,请参考以下文章

在网站中集成 Paymetric.com

无法在现有应用程序中集成 Spring Security

如何在我的应用程序中集成 ATOM 支付网关?

在 Windows 窗体应用程序中集成 bat 文件

在 VB.NET 应用程序中集成 PSR

如何在条码扫描仪的移动 web 应用程序中集成 Phonegap 插件?