none
Hotkeys in Modern UI Oberfläche RRS feed

  • Frage

  • Hallo,

    ich würde gerne allen Buttons in meiner Appbar ein Hotkey zu weisen. Jedoch ist dies scheinber eine mittelschwere Katastrophe in ModernUI. Ich arbeite mit MVVM. Ich habe jetzt einfach das KeyDown-Ereignis der Seite geordert um ein Hotkey zu realisieren.

    Aber ein paar Punkte sind mir immer noch nicht klar.

    1) Wie soll man einen "Modifier" wir die ALT oder STRG-Taste Abfragen?

    2) Wie aktualisiere ich die Bindings vorab? In meinen konkreten Fall mache ich eine Änderung in einer TextBox. Ich drücke den Hotkey und es wird das an die TextBox gebundene Element nicht aktualisiert.

    Montag, 20. Mai 2013 16:31

Alle Antworten

  • 1) Wie soll man einen "Modifier" wir die ALT oder STRG-Taste Abfragen?

    Das ist leider eher kompliziert. So geht es am Beispiel STRG+P:

    using System;
    using Windows.Graphics.Printing;
    using Windows.System;
    using Windows.UI.Xaml.Input;
    //...
    private bool _isCtrlKeyPressed;
    
    private void PageKeyUp(object sender, KeyRoutedEventArgs e)
    {
      if (e.Key == VirtualKey.Control)
      {
        _isCtrlKeyPressed = false;
      }
    }
    
    private void PageKeyDown(object sender, KeyRoutedEventArgs e)
    {
      if (e.Key == VirtualKey.Control)
      {
        _isCtrlKeyPressed = true;
      }
      else if (_isCtrlKeyPressed)
      {
        switch (e.Key)
        {
          case VirtualKey.P:
            PrintManager.ShowPrintUIAsync();
            break;
        }
      }
    }

    Es geht also darum, bei KeyDown gleich abzufangen, ob STRG (oder ALT) gedrückt ist und dies in eine Membervariable zu schreiben. Mithilfe eines Switch-Statements kannst du anschließend auf bestimmte gedrückte Tasten reagieren und anschließend den entsprechenden Command ausführen oder eigenen Code anstoßen. Wichtig ist, dass bei KeyUp die Membervariable wieder zurückgesetzt wird. Mehr hierzu findest du auch im MSDN-Artikel Reaktion auf Tastaturinteraktionen.

    2) Wie aktualisiere ich die Bindings vorab? In meinen konkreten Fall mache ich eine Änderung in einer TextBox. Ich drücke den Hotkey und es wird das an die TextBox gebundene Element nicht aktualisiert.

    Das habe ich noch nicht ganz verstanden: Möchtest du das Binding über den Hotkey/Button deaktivieren und zuvor sicherstellen, dass die Änderung noch ins VM übertragen wird?

    --
    Beste Grüße,
    Christian

    • Als Antwort markiert UrielMhezzek Dienstag, 21. Mai 2013 07:48
    • Tag als Antwort aufgehoben UrielMhezzek Dienstag, 21. Mai 2013 07:48
    Dienstag, 21. Mai 2013 06:44
  • Danke Chliebel.

    Zu 1) Oh man. Da muss aber MS dringend nachbessern. Da hat wohl jemand nicht nachgedacht. Ich finde es eh unsinngig warum man Commands keine Hotkeys schon in WPF definieren kann, damit diese Auslösen und man auf Ereignisse in Grids und Co zurück greifen muss.

    Zu 2) Also ich habe eine Textbox, in der über das Binding "Bücher" gemeldet wird. Wenn ich den Text jetzt abändere und z.B. den Text "Bücher zu C#" schreibe und in folge direkt mein Hotkey drücke, wird der neue Text nicht an das Objekt übergeben. Dieses muss aber unbedingt gemacht werden bevor ich eine Kopie des Objektes erstelle (wofür der Hotkey gedacht ist). Das neue Objekt wird auch direkt aktiv und des alte erhält so nie die Chance, seine änderung zu melden. Ich habe zwar schon einen Workaround, aber der ist sehr umständlich über Tags gelößt.

    Dienstag, 21. Mai 2013 07:57
  • Zu 2) Also ich habe eine Textbox, in der über das Binding "Bücher" gemeldet wird. Wenn ich den Text jetzt abändere und z.B. den Text "Bücher zu C#" schreibe und in folge direkt mein Hotkey drücke, wird der neue Text nicht an das Objekt übergeben. Dieses muss aber unbedingt gemacht werden bevor ich eine Kopie des Objektes erstelle (wofür der Hotkey gedacht ist). Das neue Objekt wird auch direkt aktiv und des alte erhält so nie die Chance, seine änderung zu melden. Ich habe zwar schon einen Workaround, aber der ist sehr umständlich über Tags gelößt.

    Hallo Uriel,

    in diesem Anwendungsfall kommst du um zusätzliche Infrastruktur im Codebehind wohl nicht herum. Eine weitere Idee wäre, dem Eingabefeld einen Namen zu geben und vor dem Wechsel zum neuen Objekt im Codebehind die entsprechenden Werte auf das alte Objekt zu setzen. Das ist zwar nicht unbedingt schöner, aber möglicherweise schlanker als dein aktueller Ansatz.

    Eine wirklich saubere Methode, solche Fälle abzuwickeln, ist mir leider nicht bekannt.

    --
    Beste Grüße,
    Christian

    Dienstag, 21. Mai 2013 08:51