2009-06-19 9 views
0

C#デスクトップアプリケーションでは、テキストウィジェットを含むカスタマーウィジェットがあります。ショートカットキーとしてDeleteキーを持つメニューストリップにもメニュー項目があります。私が見つけているのは、ユーザーが文字を削除することを期待するテキストボックスのdeleteキーを押すと、メニュー項目が実際にトリガされ、作業中のオブジェクト全体が削除されているということです。C#カスタムウィジェットのDeleteキーがメニューのショートカットを引き起こさないようにする

メニュー項目ではなくキー入力を処理する際にテキストボックスに「最初の亀裂」があるようにする方法はありますか?

ありがとうございました。

+0

あなたはWinFormsを使用していますか? WPF?他のUIライブラリですか? – LBushkin

+0

@LBushkin - 私たちはWinFormsを使用しています –

+0

[編集メニューで削除]の可能な複製(http://stackoverflow.com/questions/358973/delete-in-edit-menu) – EricLaw

答えて

1

削除キーをフォームレベルで処理していますか?いずれにしても、フォーカスを持っているウィジェットをチェックしてからイベントを処理することはできません。グローバルショートカットとしてdeleteを使用しない方が良いでしょう。これは、ctrl + c、alt + f4、またはtabが何を再割り当てするかのようです。

+0

@ marr75、私がこの問題を見るほど、グローバルなショートカットとしてDeleteを使うのは悪い考えです。顧客がそれを望んでいると思ったときにのみ削除を実行するために追加する必要があるコードの量は驚異的です。逆に、私たちが心配しているウィジェットがアクティブなときには、私たちは元の意図に非常に近づくでしょう。 –

+0

私の以前のコメントに対する修正:気になるウィジェットがアクティブなときにキーを押すだけでは、それぞれのアクションの横にショートカットキーが表示されないので、有効な解決策でもありません。 –

+0

@ marr75、私はショートカットキーとして削除を使用することは悪い考えであるという陳述に同意しなければなりません。デフォルトの処理を持たないウィジェットに単純に適用しています。私たちはCtrl-C、Ctrl-V、Ctrl-Xと全く同じ問題を抱えていますが、メニュー項目のショートカットキーとして多くのプログラムが使用していますが、ユーザーがいつそれらを意図しているかを何とか知ることができますサイドバーのウィジェットではなく、メインウィンドウに適用されます。 (実際には、すべてがうまく処理されているわけではありません。Microsoft Projectは、Microsoft Projectと同じバグがあることを最近発見しました) –

1

「全体を削除する」メニュー項目のショートカットキーをShift-DelまたはCtrl-Del ...に変更すると、オブジェクト全体を削除するためにユーザーがもう少し作業するようになります。

これはオプションではない場合は、MenuStripの削除コードでフォームのActiveControlをチェックし、TextBoxの場合はTextbox.SelectionStartの値をチェックして、テキスト内のカーソルの位置を取得して文字を手動で削除します。

if (myTextBox.Text.Length() >0) { 
    int pos = myTextBox.SelectionStart; 
    string txt = myTextBox.Text; 
    if (pos < txt.Length()) { 
    myTextBox.Text = txt.Substring(0,txt.Substring(0, pos-1) + txt.substring(pos+1); 
    } 
} 
+0

@ C-Pound Guru、ちょうどキーショートカットを削除してください。コピー&ペースト(それぞれCtrl-C、Ctrl-V)してください。これらは、これらの操作のための標準的な短縮策です。ユーザーがメインウィジェット上でアクションを実行しようとしているときにのみアクションが実行されるようにそれらをShift-Ctrl-CおよびShift-Ctrl-Vに変更すると、アプリケーションが厄介で非標準的に見えるようです。 テキストボックスが1つしかない場合は、複数のウィジェットがあり、それぞれにイベントを追加してユーザーの意図が煩雑になると推測しようとする場合、2番目のオプションは見つかるでしょう。 –

0

フォームでKeyPreviewをFalseに設定します。

カスタマーウィジェットがオンになっている可能性があるため、テキストボックスにフォーカスが当たったときにフォーム上のKeyPreviewを無効にする必要があります(フォーカスを失ったときに再び有効にする)。

それ以外の場合は、デザイナーから無効にする必要があります。私たちが使用して終了

+0

@RBarryYoung - 呼び出しが行われた時点でKeyPreviewがオンになっていません。メインメニューには、メインフォームとは別の特別なプレビュー権限が必要です。 –

1

私たちが何をしたか

ソリューションは、制御は、これらのメニュー項目が作用することを意図したことと、それによって、それぞれのショートカットキーを無効にし、これらのメニュー項目を無効にすることでした。

これは、関連のないテキストボックスで削除をクリックすると、メインウィジェット内の選択された項目が削除されるという問題を解決しました。しかし、それは、ユーザがこれらのメニュー項目にアクセスするためにメインウィジェットをクリックしなければならないという問題を引き起こす。これにちょっとした対策として、非表示のウィジェットを含むパネルが隠されているときに、メインウィジェットがフォーカスを取り戻すようにしました。

私はこの解決策を提唱していません。私は私の究極のソリューションだけになり

を好きだろう何

場合にのみ、アクションを実行します。主なウィジェットもクリックを経由してトリガされた焦点を当て、OR

  • あり

    1. メニュー項目

    しかし、このようにしてもトリガーされたかどうかを検出する方法はないようですフレームワーク内のホルトカットキー。

  • 関連する問題