1

Visual Studio .NET で構築された既存の WinForms アプリの状況依存ヘルプを実装しています。フォームに を追加し、フォーム上のすべてのコントロールとメニュー項目をカバーする素晴らしいプロパティをHelpProvider設定しました。から派生したすべてのコントロールに必要なものを設定しましたが、これまでのところすべてが素晴らしいです.F1は完全に機能します.HelpNamespace.chmHelpKeywordControl

私の問題は、メニュー項目に対してそれを行う方法がわからないことです。これらは、ToolStripMenuItemから派生していないControlため、HelpKeywordプロパティを持たないクラスを使用します。個々のメニュー項目に状況依存のヘルプを提供するにはどうすればよいですか? グーグル氏はあまり積極的ではありません。

4

1 に答える 1

5

を使用F1することは、メニュー項目のヘルプを提供する一般的な方法ではありません。メニュー項目は通常ToolTipを使用するか、 StatusBarにヘルプ テキストを表示するか、通常はメイン ページのヘルプ コンテンツに包括的なヘルプが付属しています。

上記のソリューションのいずれかを使用することを好みますが、ここでは学習目的HelpRequestedで、フォームのイベントを使用して何ができるかを示します。

HelpRequestedフォームとコントロールのヘルプを処理するには、フォームとコントロールのイベントに依存できます。

Formここでは、問題を解決するためにイベントに頼ることができます。on フォームがあるため、すべてのコントロールのイベントを内部で処理HelpProviderすることを知っておく必要があります。コントロールが に設定されている場合は、 に設定され、イベントのバブルアップが防止されるため、 が の場合にヘルプ イベントを処理するためのカスタム コードを作成できません。そのため、コントロールに設定して、お助けキーホルダーとして使用する必要があります。HelpProviderHelpRequestedShowHelptrueHandledtrueShowHelptrueShowHelpfalseHelpProvider

フォームのイベントを使用して問題を解決するには、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. メニューの子孫を見つけるためのヘルパー メソッドの作成- 次のコードを持つアプリケーションにクラスを追加します。ToolStripMenuItem次のコードでは、 a のすべてのサブを取得する拡張メソッドを導入しましたMenuStrip

    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フォームのプロパティでhelp キーワードを表示するだけです。これは、ソリューションが機能していることを意味し、その後、適切な chm ファイルを作成できます。
  • 要件に基づいて、クラスのShowHelpメソッドの他のオーバーロードのいずれかを使用できます。Help
  • コントロールには拡張プロパティがありHelpKeywordHelpString使用しているものに注意して、HelpRequestedイベントで同じものを取得してください。
  • ShowHelpfalseに設定することを忘れないでください。この手順を忘れると、イベントは で内部的に処理されHelpproviderます。
  • Tagメニュー項目のプロパティにヘルプ キーワードを割り当てることを忘れないでください。将来的に使いやすくするために、ヘルプ キーワード プロパティをメニュー項目に追加するエクステンダー プロバイダーを作成するだけです。
于 2017-10-24T02:23:17.937 に答える