24432


Windows10、VisualStudio2015、.Net4.6、WPF、C# で開発しております。

TextBoxの入力を有効にしつつKeyDownイベントを親に伝えないようにするにはどうしたら良いのでしょうか。

* * *

MainWindow.xaml

[code]

    <StackPanel KeyDown="StackPanel_KeyDown">
        <TextBox KeyDown="TextBox_KeyDown" />
        <TextBlock x:Name="memo" />
    </StackPanel>
    
[/code]

MainWindow.xaml.cs

[code]

    private void StackPanel_KeyDown(object sender, KeyEventArgs e)
    {
        this.memo.Text = e.Key.ToString();
        e.Handled = true; // TextBoxの入力も無効化されてしまう。何故？
    }
    
    private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        //e.Handled = true; // TextBoxの入力が無効化
    }
    
[/code]

上記のように KeyDown イベントで `e.Handled=true` をしてルーティングイベントを停止すれば良いと思ったのですが、親である
StackPanel で停止させた場合でも TextBox の入力が何故かできなくなってしまいます。

どのように実装したらよいのでしょうか。


CC BY-SA 3.0
2016-04-28T12:51:00.210
24427
2016-04-28T16:26:55.517
14817
question
c# wpf
TextBoxの入力を有効にしつつKeyDownイベントを親に伝えない方法は？


[テキスト入力](https://msdn.microsoft.com/ja-
jp/library/ms754010\(v=vs.110\).aspx#Anchor_3)によると

> テキスト入力の主要な手段はキーボードですが、音声認識、手書き、およびその他の入力デバイスもテキスト入力を生成できます。  
>  キーボード入力の場合、WPF は、最初に適切な KeyDown / KeyUp イベントを送信します。 そのイベントが処理されず、キーがテキストの場合
> (方向キーやファンクション キーなどのコントロール キーでない場合)、TextInput イベントが発生します。

ということですから、`KeyDown`イベントで`e.Handled = true;`とした時点でテキスト入力できなくなります。

> TextBoxの入力を有効にしつつKeyDownイベントを親に伝えない

は不可能ですので、何を目的にこのような処理を行おうとしているのか、目的に沿った別アプローチを模索してください。


CC BY-SA 3.0
2016-04-28T13:35:50.653
24428
2016-04-28T13:35:50.653
4236
24427
answer


`TextBox`の`TextInput`イベントは`TextCompositionManager`を使用して疑似的に発生させることができます。

[code]

    var tc = new TextComposition(InputManager.Current, textBox, "入力するテキスト");
    TextCompositionManager.StartComposition(tc);
    
[/code]

なので`KeyDown`イベントの`KeyEventArgs`から入力すべき文字が分かるのであれば、`e.Handled =
true;`とするのと同時に`TextCompositionManager.StartComposition`を実行してやれば`KeyDown`イベントを伝播せずにテキスト入力を行うことが可能です。

ただ、この方法では通常フレームワークが解決してくれるキーと文字の対応を自分で定義しなければなりません。大雑把に言って数十種類のキーに対して処理を書く必要がありかなりの力技となるため、テキスト入力とその他のキーイベント処理が干渉しないように仕様を変更するのが妥当だと思います。


CC BY-SA 3.0
2016-04-28T16:26:55.517
24432
2016-04-28T16:26:55.517
5750
24427
answer