2016-06-21 11 views
3

Ich habe ein DataGrid, das DataGridTextColumns verwendet, um einige Daten anzuzeigen, von denen ich einige ändern möchte. Alles funktioniert gut, außer mit den Pfeilen, um es zu navigieren. Wenn ich eine Zelle auswähle und mit den Pfeilen bewege, funktioniert alles, aber ich möchte das Gleiche mit der TextBoxCell tun. Was ich hatte und arbeitete, war mit VisualTreeHelper durch den visuellen Baum zu gehen und die nächste Zelle zu holen und die TextBox auszuwählen; Es war jedoch sehr, sehr lange Code gegeben, dass ich jeden Schlüssel separat verarbeiten musste. Da die Zellen bereits die Veranstaltung in dieser Art und Weise verarbeiten, habe ich versucht, dieses:Verwenden der Pfeile zum Navigieren in den Textfeldern in einem DataGrid WPF

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { 
      TextBox tb = sender as TextBox; 
      var temp = VisualTreeHelper.GetParent(tb); 
      var cell = temp as DataGridCell; 
      while (cell == null) { 
       temp = VisualTreeHelper.GetParent(temp); 
       cell = temp as DataGridCell; 
      } 
      if (tb == null) 
       return; 
      cell.RaiseEvent(e); 
} 

Aber immer, wenn ich die Schlüssel verwenden, passiert nichts. Das Ereignis wird einfach übersprungen. Der Code wird bis zum RaiseEvent ausgeführt, aber wenn diese Methode aufgerufen wird, passiert nichts. Irgendwelche Ideen? Vielen Dank im Voraus!

Antwort

2

Falls jemand anderes hineinläuft, war das Problem das Ereignis. DataGridCell verarbeitet nicht PreviewKeyDown, nur KeyDown. Die Lösung besteht darin, das Ereignis manuell zu erstellen und es an die Zelle zu senden. Berücksichtigen Sie, dass das Ereignis zweimal ausgelöst wird, wenn Sie das Ereignis nicht verarbeiten. Der vollständige Code folgt;

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { 
     TextBox tb = sender as TextBox; 
     if (tb != null && isControlKey(e.Key)) { 
      var temp = VisualTreeHelper.GetParent(tb); 
      var cell= temp as DataGridCell; 
      while (cell== null) { 
       temp = VisualTreeHelper.GetParent(temp); 
       cell = temp as DataGridCell; 
      } 

      if (tb == null || cell== null) 
       return; 
      var target = cell; 
      var routedEvent = Keyboard.KeyDownEvent; 

      if (tb.Text.Trim().Length == 0) //Just a check for the value 
       tb.Text = "0"; 

      cell.RaiseEvent(
       new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(cell), 0, e.Key) { 
        RoutedEvent = routedEvent 
       }); 
      e.Handled = true; 
     } 
    }