2011-07-20 30 views
1

のイベントを処理して、いくつかのアクションを実行するTextBoxとします。しかし、もしもが特別なButton(これはOpenFileDialogを開く)がクリックされたか、またはKey.Enterがキャッチされたので、それがフォーカスを失った場合、そのアクションを実行したくないでしょう。 Key.Enterが押されたとき、最初にKeyDownイベントが発生します。ここKeyDownの私のイベントハンドラ:Key.Enterが押された後LostFocusの処理の問題

public void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if (e != null && sender != null) 
     if (e.Key == System.Windows.Input.Key.Enter && !String.IsNullOrWhiteSpace(((TextBox)sender).Text)) 
     { 
      e.Handled = true; 
      isEnterClicked = true; 
      ((System.Windows.Controls.TextBox)sender).Visibility = System.Windows.Visibility.Collapsed; 
     } 
} 

、TextBox.Visibilityが変更され、このオペレータはLostFocusイベントを発生させます。

public void TextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     if (!isEnterClicked) 
     { 
      DependencyObject dob = (DependencyObject)sender; 
      while (!(dob is ItemsControl)) 
      { 
       dob = VisualTreeHelper.GetParent(dob); 
      } 
      dynamic myCmd = dob.GetValue(Control.DataContextProperty); 
      myCmd.SomeCommand.Execute(((TextBox)sender).GetValue(Control.DataContextProperty)); 
     } 
    } 
    finally 
    { 
     isEnterClicked = false; 
    } 
} 

LostFocusハンドラまずisEnterPressedがfalseに等しいかどうかを見て、その平均値、TextBoxは入るが押されたので、それはない注力失いました。 SomeCommandTextBoxにバインドされたアイテムを削除し、消えます。

Q:だから、Button.Clickと同じようにするには?

まず、bfeoreButton click、TextBoxフォーカスを失った。同じ方法では受け入れられません。 Button.Focusable="False"、新しいControlTemplateを作成したり、Timer.Elapsedイベントを処理しても私の要件を満たしていません。

答えて

0

私が問題を正しく理解していれば、ボタンがフォーカスされているかどうかを確認してください。そうしないと、テキストボックスのlostfocusイベントでアクションを実行できません。テキストボックスのlostfocusイベントが発生する前に、Iamの正しいボタンにフォーカスを当てる必要があります。

if (!isEnterClicked && !button.Focused) 
{ 
    //do stuff 
} 
+0

動作しません。 'LostFocus'は' Button.IsFocused'が 'true'に設定されるより早く発生します。 – stukselbax

+0

私はwinformsに縛られていて、私はwpfでそれが違うと思うと思った:/ – Reniuz

+0

とにかく、あなたの提案に感謝! – stukselbax