2011-01-26 20 views
2

Windows.Forms.ToolStripControlHostクラスを使用して、コンテキストメニューにカラーピッカーを埋め込みました。ピッカーは、細かい表示され、適切にすべてのマウスイベントを処理します。チャンネルスライダーの一つがダブルクリックされたときに閉じるメニューからEnterを押すのを防ぐ方法

enter image description here

問題が発生します。これにより、コントロールは、ユーザーが数値を入力できるように、スライダと同じ次元の親コントロールにWindows.Forms.TextBoxを追加します。 TextBoxにフォーカスがある間にEnterキーを押すと、値を割り当ててテキストボックスを非表示にする必要がありますが、メニュー構造全体も閉じます。だから、どうやってメニューを生き生きさせておくのですか?

enter image description here

あり関与コードの非常に多くのですが、必要であれば、私はそれを投稿します。

+2

うわー、そうです。これは信じられないほど壊れやすいデザインのようです。私は間違いなく私が実際にそれを使用し終わる前にピッカーを却下しないように自分自身を信じていました、私の祖母ははるかに少なくなりました。それが価値があるかどうか、私はたくさんの*モーダルでない、浮動ツールウィンドウを好むでしょう。 –

+0

@Cody、それは実際には驚くほどうまく動作します。ピッカーがフォーカスを受け取ったときに他のメニュー項目をロックするので、メニューを閉じるための唯一の方法は、その外側をクリックするか、EnterまたはEscapeを押すことです。 –

+0

これにより、これはいくらか実行可能になるかもしれません。しかし、あなたはそれをどうやって管理していますか?私の答えのコメントにあなたが記述したメニューとその内容との間の分離を考えていますか?明らかに私はあなたがこれをどのように実装したのかは分かりませんが、 "ロック"機能を拡張してEnterキーの押下を抑制して抑制するという単純な問題のようです。ハッキーな解決策は、グローバルフラグを設定することです。 –

答えて

1

どうにかしてを入力してコンテキストメニューにアクセスしてください。明らかに、デフォルトの動作は、ユーザがを押したときに現在強調表示されている項目を「選択」することです。を入力してください。

ContextMenuStripコントロールをサブクラス化して(そうしていない場合)、そのProcessCmdKey methodをオーバーライドします。値がKeys.Enterに対応するkeyDataの値を確認し、その値を検出した場合は、Trueを返して、その文字がコントロールによって既に処理されたことを示し、それ以降の処理のために渡されないようにします。他のすべてはもちろん、他のキー(矢印キーなど)の動作が変更されないように、基本クラスの処理を許可します。例えば

(私はこれをテストし、それが正常に動作します):ときにキーの押下を入力するよう

public class CrazyContextMenuStrip : ContextMenuStrip 
{ 
    protected override bool ProcessCmdKey(ref Message m, Keys keyData) 
    { 
     if (keyData == Keys.Enter) 
     { 
      // Eat it when the user presses Enter to 
      // prevent the context menu from closing 
      return true; 
     } 

     // Let the base class handle everything else 
     return base.ProcessCmdKey(m, keyData); 
    } 
} 

そしてもちろん、あなたは上記のコードに追加のチェックを追加することができますのみを食べていますカラーピッカーが表示され、予定どおりに動作するようになります。

+0

ええと、それはかなり悪いニュースです。メニュー自体はその内容については知りません(実行時にいくつかの異なるクラスで記入されています)ので、Enterのプレスをいつ無視するかを決定すると、そのレベルで扱いにくくなります。これが代替である場合は、埋め込みカラーピッカーでダブルクリックテキストボックス入力機能を無効にすることにします。 –

+0

@David:あなたが何を期待しているのか分かりません。メニューのデザインメリットと実用性の両方のメリットについては理解していませんが、その知識がない特定のインスタンスでの動作をどのように上書きするのか想像するのは難しいです。私は壊れたレコードのように聞こえるわけではありませんが、あなたのプラットフォームのツールセットにあまりにも蔓延している動作を変更しようとすると悪いニュースの準備をするべきです。 –

+0

よく私は、winformsコントロールをサブクラス化し、潜在的に継承階層を破ることを含まないソリューションを期待していました。多分私が見逃してしまった既存の不動産や見過ごした出来事。私はあなたのソリューションを現時点で試していますが、私はサブメニューにも対処しなければならないので、かなり苦労しています。私は現在、オーバーライドされたwinformsクラスの私の眼球に慣れており、内部フレームワーク型に慣れています。 Lando Calrissianを引用する。 "この取引はいつも悪化している!" –

関連する問題