2

こんにちは。C#で記述されたWindowsアプリケーションを拡張して、ユーザーがF1キーを押したときに(フォーカスされたコントロールのコンテキストで)ユーザーにヘルプを提供します。

Control.HelpRequestedイベントを利用したいのですが、このイベントを処理するためにすべてのコントロールを拡張する方法がわかりません。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.helprequested.aspx

このイベントを処理するために各コントロールを「手動で」更新することは実際には不可能であり、フォーム内のすべてのコントロールを(フォームが開いたときに)ループしてイベントハンドラーを関連付けるというアイデアは本当に好きではありません。

特定のイベントを処理するためにフォームのすべてのコントロールを拡張するためのきちんとした方法はありますか?

これは作り上げたばかりですが、私はこのようなものを書くことができるはずだとほとんど感じています

[HandleEvent Control.HelpRequested、ApplyTo Typeof(Control)]
void MyEventHandler(オブジェクト送信者、EventArgs e)
{{
//イベントを処理するコード...
}

別のアプローチに関する提案やアイデアは大歓迎です-ありがとう

4

3 に答える 3

2

この例(http://www.codeproject.com/KB/cs/ContextHelpMadeEasy.aspx)は、WndProcでF1キーをトラップし、1つのメソッドからのヘルプのみを表示する方法を示しています。

この記事のアイデアは、コントロールのIDを公開するインターフェイスを実装し、そのIDに基づいてコンテキストヘルプを表示することです。次に、F1ハンドラーは、コントロールがそのインターフェイスを実装しているかどうかをチェックし、実装していない場合は、そのインターフェイスの実装が見つかるまでコントロールの親をチェックします。

ただし、さらに簡単なアプローチ(各コントロールにIDを追加したくない場合)は、サポートされているすべてのコントロールのトピックIDを含む静的タイプディクショナリ(例:ディクショナリ)に基づいてコンテキストヘルプを表示するようにF1ハンドラーを変更することです。 。したがって、トピックを指定されたコントロールに関連付ける必要があるときはいつでも、辞書を更新します。

繰り返しになりますが、ある種のプロバイダー(デリゲートまたはインターフェース)をそのディクショナリに追加することにより、このアプローチにさらに抽象化を追加する方が賢明です。たとえば、コントロールのタイプ、名前、またはその他のプロパティに基づいてトピックを表示するために、追加のロジックが必要になる場合があります。

于 2009-04-21T11:19:43.943 に答える
0

フォーム内のすべてのコントロールを(フォームが開いたときに)ループしてイベントハンドラーを関連付けるというアイデアは本当に好きではありません。

なぜか聞いてもいいですか?

デリゲートと型のリストを引数として受け取る関数を作成できます。これは、「wishedfor」HandleEvent属性とまったく同じ効果があります。

于 2009-04-21T11:17:56.727 に答える
0

サポートはHelpRequestedバブルアップメカニズムです。アクティブなコントロールに対して起動し、イベントを処理せずHandled、イベントargのプロパティをに設定しない場合trueは、親コントロール階層にバブルアップして形成されます。

したがってHelpRequested、フォームを処理するだけで十分です。次に、フォームまたはその親階層のアクティブな制御に基づいて、表示するヘルプを決定できます。

以下のような形式のイベントを処理する場合、メッセージボックスHelpRequestedを押すF1とポップアップが表示され、アクティブなコントロールの名前が表示されます。

private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent)
{
    var c = this.ActiveControl;
    if(c!=null)
        MessageBox.Show(c.Name);
}
于 2016-07-24T17:26:16.880 に答える