2011-12-20 3 views
0

ToolStripDropDownButtonでカスタムコントロールを使用しています。 ToolStripDropDownButtonには、多数のツールストリップ項目(特に、チェックボックスであるカスタムツールストリップ項目)があります。ユーザーは、どのチェックボックス項目を選択するかを選択でき、DropDownClosedイベントを処理して、そのチェック項目を利用します。ToolStripDropDownButton - Escキーでドロップダウンの動作を変更します。

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

私はToolStripDropDownButtonをホスティングコントロール上で次のオーバーライドで遊んで試してみた:ドロップダウンがこれらのイベントのいずれかが処理される前に、隠しているようだとして、多くの成功なし

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

。 この動作を変更する最善の方法は何ですか?

答えて

0

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

編集: DropDownClosedイベントの後にProcessCmdKeyまたはProcessKeyPreviewがトリガーされた場合、タイマーを使用して遅延を組み込むことができます。 DropDownClosedはタイマーを開始し、Escキーを押すとProcessCmdKeyまたはProcessKeyPreviewがフラグを設定できます。タイマーが動くと、ユーザーが行ったチェックを元に戻すか適用することができます。それがなかったので[OK]を、上書きがToolStripDropDownButtonに取り組んでいなかった理由がある

public class ToolStripDropDownEx : ToolStripDropDown { 

    protected override bool ProcessDialogKey(Keys keyData) { 
    if (keyData == Keys.Escape) 
     return true; 
    else 
     return base.ProcessDialogKey(keyData); 
    } 
} 
+0

私はすでにそれを試みましたが、子コントロールはメインコントロールが動作する前にイベントを処理しています。フォーム上で、Form.KeyPreviewをtrueに設定すると、コントロールの前にキーイベントを受け取ることができます。しかし、ユーザーコントロールは異なります。いずれにしても、キーイベントを処理しようとしてもドロップダウンが終了した後に*発生するようです。 OnDropDownClosedメソッドをオーバーライドできますが、Escが押されたかどうかの表示が必要です。 – MoSlo

+1

ToolStripメニューの外の場所をクリックすると、選択内容を適用する必要があることをユーザーはどのように示しますか?その場合は、「適用」オプションを「ツールストリップ」メニューに追加する方が良いでしょうか?次に、ユーザー(およびコード...)はいつ変更を適用するのか、いつ取り消すのかを正確に知っています。 – Veldmuis

2

は、ドロップダウンを閉じてからEscキーキーを傍受ToolStripDropDownのこのバージョンを使用してみてくださいフォーカスを持っていたコンポーネントの項目には、ドロップダウンが表示されているときにフォーカスがあり、ドロップダウンが表示されているときに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イベントがキャンセルとみなされているかどうかに関して、(コントロール自体のか、イベント引数の一部としてのいずれか)の特性を確認することができます。

+0

有望そうです。 KeyDown(processCmdKey、wndProcなど)を処理するためにToolStripDownButtonを継承しましたが、これを試してみます。 – MoSlo

関連する問題