2016-04-01 12 views
1

ここでは、keydownイベントで別のキーを処理する必要があるウィンドウがあります。 Enterを押すと、テキストボックスがポップアップし、このテキストボックスに入力されたテキストは、ウィンドウキーダウンイベントを発生させるべきではない(SHOULD NOT)。keydownイベントをバブルアップから守る正しい方法

<Window x:Class="PopupTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:PopupTest" 
    mc:Ignorable="d" 
    Title="MainWindow" 
    Height="350" 
    Width="525" 
    KeyDown="Window_KeyDown" > 
<Grid> 
    <Popup Name="symbolPopup" 
      Grid.Row="0" 
      Placement="RelativePoint" 
      IsOpen="False"> 
     <TextBox Width="70" x:Name="symbolTextBox" 
       KeyDown="symbolTextBox_KeyDown" 
       Background="#FFFFDF18" /> 

    </Popup> 
</Grid> 

の背後にあるコード:

private void Window_KeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.Key) 
     { 
      case Key.Enter: 
       { 
        symbolPopup.IsOpen = true; 
        symbolTextBox.Focus(); 
        break; 
       } 
      default: 
       break; 
     } 
    } 

    private void symbolTextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      symbolPopup.IsOpen = false; 
      string name = symbolTextBox.Text; 
      symbolTextBox.Text = null; 
      e.Handled = true; 
      MessageBox.Show(name + " assigned"); 
     } 
     // e.Handled = true; 
    } 

私は、ポップアップが開いている間に発射するウィンドウのKeyDownイベントを必要としません。 //e.Handled = trueのコメントを外すと、textboxはテキストをまったく取得しません。私はポップアップがウィンドウkeydownハンドラの本体で開いているかどうかをチェックすることでこれを解決することができることを知っていますが、私の質問はどのようにテキストボックスからテキストを取得し、

+1

あなたのユースケースでは、OriginalSourceは機能しますか?ここでの回答を参照してください:http://stackoverflow.com/questions/24872940/how-do-i-stop-wpf-keydown-events-from-bubbling-up-from-certain-contained-control – Bobby

+0

キーが押されたときにコントロールにフォーカスが当てられますが、これはマウスイベントでは機能しますが、キープレスでは必ずしも明白ではありません – MikeT

答えて

0

あなたはちょうどあなたがプレビューイベントにイベントを切り替えると考えられてきた

例えば あなたの取扱いで賢くする必要が発射イベントを停止することはできませんか? What are WPF Preview Events?ウィンドウイベントハンドラで

か、ポップアップの可視性

の値に基づいて処理を設定することができることができないので

if(popup.Visibility == Visibility.Visible) 
{ 
    //ignore event 
} 
else 
{ 
    //handle window processing 
    e.Handled = true; 
} 

真e.Handled =がバブリングをキャンセルすることを覚えておいてください/トンネリングプロセスは、他の何もイベントを処理したくないときにのみ設定してください。

関連する問題