16


1

WPFアプリケーションでは、TextBoxから派生したコントロールがあります。

パブリッククラスSelectableTextBlock:TextBox {protected override void OnKeyDown(KeyEventArgs e){base.OnKeyDown(e);} e.Handled = false; }}

OnKeyDownメソッドは、TextBoxにスペースを入力するときやBackspaceを押すときには呼び出されませんが、通常の印刷可能文字を含む他の入力(たとえば、 'a')と修飾キー(例: )

私はIsReadOnlyをtrueに設定してこのコントロールを使用しているので、選択可能で編集不可能なテキストを表示できます。 WPFToolkitのDataGrid内で使用されるコントロールで、SelectableTextBlockにフォーカスがある場合でもKeyDownイベントでデータグリッドを伝播させたいので、カスタムコントロールを使用してイベントを未処理として明示的にマークします。

問題は、このイベントが特定のキーを制御することさえできないことです。 DataGridでOnPreviewKeyDownを使用してこれを回避することはできません。データグリッドで使用される他のコントロールにspace KeyDownイベントを飲み込ませたくないからです。

スペースキーが伝搬するKeyDownイベントを取得する方法を誰かが知っていますか?

ありがとう。

4 Answer


15


PreviewKeyDownイベントはまさにこのようなことのために存在します。

private void spacebarHandler_PreviewKeyDown(オブジェクト送信側、KeyEventArgs e){if(e.Key == Key.Space)e.Handled = true; }

KeyDownハンドラは、スペースバーのKeyDownイベントを受け取ることはありません。


14


問題は、スペース(およびバックスペースなど)のキーダウンイベントが、TextBox内ですでに処理されていて、それが私の派生コントロールにバブルアップする前に発生していることです。 私は、Wimが投稿したように、テキスト作成プロセスの一部として想定しています。

これを回避するために、すでに処理されていてもキーダウンイベントを受け取るハンドラを追加し、そのHandledメンバをfalseに設定して、正常にバブリングを続行できるようにしました。 以下の例ではスペースキーのためだけにこれをします、しかし私の場合私はどのキーイベントがわからないので私が本当にSelectedableTextBlockで処理したくないすべてのキーイベントのためにこれをする必要があります両親はまだ興味があるかもしれません。

パブリッククラスSelectableTextBlock:TextBox {public SelectableTextBlock():base(){this.AddHandler(SelectableTextBlock.KeyDownEvent、new RoutedEventHandler(HandleHandledKeyDown)、true); }

public void HandleHandledKeyDown(オブジェクト送信側、RoutedEventArgs e) if(ke.Key == Key.Space){ke.Handled = false; ...} ... }

誰かがより良い解決策を持っている場合私はもちろんまだ興味を持っています…​

ありがとう、E


2


私はテキストボックス内のスペースとイベントでこの問題を抱えていた。 スペース文字を追加または削除したときだけイベントが発生しませんか。

これが私が答えとして手に入れたものです。

_一部のIMEは空白キーストロークをテキスト合成プロセスの一部として扱うので、TextInputイベントを介して正しい合成テキストをレポートするためにAvalonが浪費するのはそのためです。

私は完全に範囲外になる可能性がありますが、このスレッドを読んでいると私がかつて抱えていた問題について思いやりがありました。

親切、ウィム


2


TextBoxからsay、RestrictKeysTextBoxを派生させます。

パブリッククラスRestrictKeysTextBox:TextBox {.... }

RestrictKeysTextBoxのOnPreviewKeyDownイベントをオーバーライドします。

このようにこのオーバーライドにロジックを入れます。

if(e.Key == Key.Space){e.Handled = true; }

RestrictKeysTextBoxのインスタンスをDataGridにバインドします。

DataGridのOnPreviewKeyDownをオーバーライドすることなく機能し、関連する問題を解消するはずです。