Laden...

[gelöst] UserControl KeyDown aktivieren?

Erstellt von ErfinderDesRades vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.356 Views
ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren
[gelöst] UserControl KeyDown aktivieren?

Hi!

Ich hab ein UserControl mit einem ItemsControl drauf und Haufen TextBlöcke und Kram. Aber nichts, was Keydowns empfängt, also keine Button, Textboxen etc..
Sonst würden ja deren KeyDowns gerouted, aber wie gesagt: hab ich nicht drauf auffm Ucl.

Gibt es irgendeine Möglichkeit das UIElement.KeydownEvent zu registrieren, oder iwas mit MetaDaten oder wasweißich, dass mein UserControl KeyDownEvents auslöst?

Der frühe Apfel fängt den Wurm.

P
157 Beiträge seit 2014
vor 8 Jahren

Hallo, was willst du denn mit den Key-Downs bezwecken ?

Wenn's zum weinen nicht reicht, lach drüber!

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

ich bastel ein Sudoku, und da soll man mittm Ziffernblock Zahlen in die Zellen eingeben.
Ausserdem zw. den Zellen navigieren.
Auch auch mit Maus Zellen selecten.

Angezeigt wirds mittels eines UniformGrids, was 9 Boxen zeigt, und jede Box zeigt mittels UniformGrid, 9 Zellen.

Der frühe Apfel fängt den Wurm.

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

versuch mal die Lösung aus WPF: Setting Keyboard Focus in a User Control? (Problems with KeyBinding)

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 8 Jahren

PotzBlitz - geht tatsächlich!

Der Fehl-Verständnis war, dass das ucl den Focus nicht automatisch nimmt, wenn man reinklickt. Aber das kann man ja dranprogrammieren:


      private void _uclSudoku_MouseDown(object sender, MouseButtonEventArgs e) {
         var cll = e.FindParentContext<CellVM>();
         SelectedCell = cll;
         Keyboard.Focus(_uclSudoku);
      }

      private void _uclSudoku_KeyDown(object sender, KeyEventArgs e) {
         if (_SelectedCell == null) return;
         int i = _AllCells.IndexOf(_SelectedCell);
         switch (e.Key) {
         case Key.Right:
            i += 1;
            break;
         case Key.Left:
            i -= 1;
            break;
         case Key.Up:
            i -= 9;
            break;
         case Key.Down:
            i += 9;
            break;
         default:
            return;
         }
         if (i < 0) i += _AllCells.Length;
         else if (i >= _AllCells.Length) i -= _AllCells.Length;
         SelectedCell = _AllCells[i];
         e.Handled = true;
      }

Und dann muss man noch beim KeyDown e.Handled setzen, sonst verlässt der Focus evtl. das Control wieder aufgrund eines Left-Tastendrucks

Der frühe Apfel fängt den Wurm.