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;
}
}
}
}
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
Vielen Dank vier Ihren Vorschlag. Ich habe es angewendet. –