2016-12-14 3 views
1

Ich habe ein KeyDown-Ereignis den Textfeldern hinzugefügt, die ich dynamisch in einem WPF-Projekt hinzugefügt habe. Ich erwarte, dass dieses Ereignis einmal für jede TextBox ausgeführt wird. Wenn ich jedoch eine beliebige Taste drücke, funktioniert dieses Ereignis für die Nummer von TextBox. Wie kann ich dieses Ereignis davon abhalten, n-1 extra auszuführen?Dynamisches Ereignis funktioniert mehr als einmal in WPF-Projekt

Dynamische Ereignis-Definition

 TextBox addTB = new TextBox(); 
     addTB.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; 
     addTB.BorderThickness = new Thickness(0); 
     addTB.BorderBrush = new SolidColorBrush(Colors.Gainsboro); 
     addTB.VerticalContentAlignment = VerticalAlignment.Center; 
     addTB.AcceptsReturn = true; 
     addTB.TextWrapping = TextWrapping.Wrap; 
     addTB.FontSize = 13; 
     addTB.Text = toDo.toDo; 
     addTB.Background = new SolidColorBrush(Color.FromRgb(64, 64, 64)); 
     addTB.Foreground = new SolidColorBrush(Colors.White); 
     addTB.Padding = new Thickness(2, 0, 10, 2); 
     AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(addedText_Changed)); 
     //AddHandler(TextBox.GotFocusEvent, new RoutedEventHandler(addedText_PreviewGotKeyboardFocus)); 
     AddHandler(TextBox.PreviewKeyDownEvent, new KeyEventHandler(addedText_PreviewKeyDown)); 
     addTB.Tag = toDo.id; 

Ereignis

private void addedText_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 

     if (e.Source is TextBox) 
     { 
      TextBox keyDownText = e.Source as TextBox; 
      if (keyDownText.IsFocused) 
      { 
       if (e.Key.Equals(Key.Down)) 
       {       
        e.Handled = true; 
        foreach (TextBox tb in FindVisualChildren<TextBox>(mainWindow)) 
        { 
         if (tb.Name != "textBox_toDo") 
         { 
          if (tb.Tag != null) 
          { 
           if ((int)tb.Tag > (int)keyDownText.Tag) 
           { 
            tb.Focus(); 
            if (!string.IsNullOrEmpty(tb.Text)) 
            { 
             tb.CaretIndex = tb.Text.Length; 
            } 
            return; 
           } 
          } 
         } 
        } 
        return; 
       } 
       else if (e.Key.Equals(Key.Up)) 
       { 
        e.Handled = true; 
        foreach (TextBox tb in FindVisualChildren<TextBox>(mainWindow).Reverse()) 
        { 
         if (tb.Name != "textBox_toDo") 
         { 
          if (tb.Tag != null) 
          { 
           if ((int)tb.Tag < (int)keyDownText.Tag) 
           { 
            tb.Focus(); 
            if (!string.IsNullOrEmpty(tb.Text)) 
            { 

             tb.CaretIndex = tb.Text.Length; 
            } 
            return; 
           } 
           if ((int)tb.Tag == appData.toDoList.OrderBy(x => x.id).First().id) 
           { 
            textBox_toDo.Focus(); 
            if (!string.IsNullOrEmpty(textBox_toDo.Text)) 
            { 

             textBox_toDo.CaretIndex = textBox_toDo.Text.Length; 
            } 
            return; 
           } 
          } 
         } 
        } 
        return; 

       } 
       else if (e.Key.Equals(Key.F4)) 
       {       
        foreach (Image image in FindVisualChildren<Image>(mainWindow).Reverse()) 
        { 
         if (image.Tag != null) 
         { 
          if (image.Name == "image_status" + keyDownText.Tag.ToString()) 
          { 
           changeStatus(image); 

           //MouseButtonEventArgs ex = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left); 
           //ex.RoutedEvent = Mouse.MouseDownEvent; 

           //image.RaiseEvent(ex); 

           return; 
           // Or 
           // InputManager.Current.ProcessInput(ex); 
          } 
         } 
        } 

        return; 
       } 
      } 
     } 
    } 
+1

Darf ich vorschlagen, dass Sie den Operator && Verschachtelung zu reduzieren verwenden? Außerdem könnten Sie andere Methoden entwerfen, die die Wiederholung in Ihrem Code stark reduzieren. – Eric

+0

Vielen Dank vier Ihren Vorschlag. Ich habe es angewendet. –

Antwort

0

Statt dessen,

AddHandler(TextBox.PreviewKeyDownEvent, new KeyEventHandler(addedText_PreviewKeyDown)); 

Versuchen Sie, direkten Handler,

addTB.PreviewkeyDown += addTB_PreviewkeyDown; 
+0

Vielen Dank für die direkte Lösung. –

0

Versuchen

AddHandler(addTB.TextChangedEvent , new TextChangedEventHandler(addedText_Changed)); 
AddHandler(addTB.PreviewKeyDownEvent, new KeyEventHandler(addedText_PreviewKeyDown)); 

Sieht man, wie jedes Mal ein Textfeld erstellen, können Sie die Event-Handler registrieren für die Textfeldklasse und nicht das Textfeldobjekt (addTB in Ihrem Fall) selbst, so dass Sie für jedes Textfeld mehrere Registrierungen haben.

+0

Wie kann ich das vermissen? Danke vielmals. –

Verwandte Themen