0

ToolStripDropDownButton を持つカスタム コントロールがあります。ToolStripDropDownButton には、多数のツールストリップ アイテム (具体的には、チェックボックスであるカスタム ツールストリップ アイテム) があります。ユーザーは必要なチェックボックス項目を選択でき、DropDownClosed イベントを処理して、それらのチェックされた項目を利用します。

目的は、ユーザーがエスケープ キーを押して選択をキャンセルすることです。問題は、Escape キーが押されたときにも DropDownClosed イベントが発生することです。したがって、ユーザーがオプションを選択し、Escape を押して選択をキャンセルしたい場合、DropDownClosed イベントが発生し、それらの設定を「適用」することになります。

ToolStripDropDownButton をホストするコントロールで次のオーバーライドを試してみました。

protected override bool ProcessCmdKey
protected override bool ProcessKeyPreview
protected override void WndProc

これらのイベントのいずれかが処理される前にドロップダウンが隠れているように見えるため、あまり成功していません。この動作を修正する最善の方法は何ですか?

4

3 に答える 3

2

キーがドロップダウンを閉じるのをToolStripDropDown傍受するこのバージョンの を使用してみてください。Esc

public class ToolStripDropDownEx : ToolStripDropDown {

  protected override bool ProcessDialogKey(Keys keyData) {
    if (keyData == Keys.Escape)
      return true;
    else
      return base.ProcessDialogKey(keyData);
  }
}
于 2011-12-20T15:28:03.067 に答える
0

OK、オーバーライドが ToolStripDropDownButton で機能しなかった理由は、フォーカスされたコンポーネントではなかったためです。ドロップダウンが表示されているときにドロップダウンの項目にフォーカスがあり、ドロップダウンが表示されているときに toolBoxButton 項目で使用可能なすべてのオーバーライド (ProcessCmdKey、ProcessDialogKey など) が起動されていました。

最後に、ToolStrip 項目自体 (この場合はチェックボックス) と対応する ToolStripDropDownButton の 2 つの派生クラスを作成しました。

public class EscapingToolStripCheckBox : CustomControls.ToolStripCheckBox
{
    private EscapingToolStripDropDownButton _parent;

    public EscapingToolStripCheckBox(EscapingToolStripDropDownButton parent)
        : base()
    {
        _parent = parent;
    }

    protected override bool ProcessCmdKey(ref Message m, Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            _parent.HandleSelection(false);
            return true;
        }
        else if (keyData == Keys.Escape)
        {
            _parent.HandleSelection(true);
            return true;
        }
        // Dont need to execute HandleSelection under any other condition. 

        return base.ProcessCmdKey(ref m, keyData);
    }

}

...ここで、HandleSelection は、選択をキャンセルするかどうかのブール値を取ります。

    public void HandleSelection(bool selectionCancelled)
    {
        _selectionCancelled = selectionCancelled;
        this.HideDropDown();
    }

そこから、DropDownClosed イベントがキャンセルされたと見なされるかどうかについて、(コントロール自体またはイベント引数の一部として) プロパティを簡単に確認できます。

于 2011-12-28T12:20:57.077 に答える
0

KeyDown または KeyPressed イベントはどうですか? それらの少なくとも 1 つが DropDownClosed イベントの前に発生し、Escape が押されたかどうかを確認して、DropDownClosed ハンドラーのフラグを設定できるようにする必要があります。

編集: DropDownClosed イベントの後に ProcessCmdKey または ProcessKeyPreview がトリガーされた場合は、タイマーを使用して遅延を組み込むことができます。DropDownClosed はタイマーを開始し、Escape が押された場合、ProcessCmdKey または ProcessKeyPreview はフラグを設定できます。タイマーが刻むと、ユーザーが行ったチェックを元に戻すか適用することができます。

于 2011-12-20T07:56:41.807 に答える