Announcement

Collapse
No announcement yet.

Override Ctrl+A in Textbox

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Override Ctrl+A in Textbox

    Serus miteinander,

    hab mal wieder ne Frage und ich hoffe ihr könnt mir weiter helfen.

    Ich hab hier eine WPF Windows Anwendung. In einem der Fenster hab ich eine Textbox in die man (wer hätte das gedacht) Text eingeben kann :-D. Allerdings möchte ich, dass beim gedrückt halten der Strg-Taste und einem Buchstaben bestimmte Sonderzeichen eingefügt werden. So zum Beispiel bei Strg+e ein é, bei Strg+o ein ó und so weiter. Das funktioniert auch prinzipiell gut, außer bei strg+a. Da wird dann der gesamte Text in der Textbox markiert. Wie kann ich diesen Mechanismus deaktivieren, so dass ich beim strg+a auch ein á in meine Textbox einfügen kann?

    Danke für eure Hilfe im Voraus

  • #2
    Und wieso willst du die normalen Verfahren nicht verwenden die sich jeder längerer Windows-User aus dem efef kann nicht verwenden und eine eigene Logik implementieren?

    Comment


    • #3
      Was meinst Du mit "normalem Verfahren"?
      In meinem Programm ist das Markieren vom gesamten Textboxinhalt nicht notwendig bzw. macht an der Stelle auch keinen Sinn. Stattdessen erhält der Benutzer einen enormen Mehrwert durch das zur Verfügungstellen eben dieser angesprochenen Tastenkürzel. So soll/kann der Benutzer in die Textbox spanische Wörter eingeben (mit sämtlichen im Spanischen vorkommenen Buchstaben, die in unserem Alphabet nicht vorliegen) ohne daß das eingestellte Windows-Tastaturlayout geändert werden muss. Und es ist beispielsweise natürlich einfacher zu merken, dass strg+a nach á und strg+e nach é, sowie strg+n nach ñ führt.

      Hat noch jemand eine Idee?

      Greeeetz

      Comment


      • #4
        Hallo,

        eigentlich möchte ich Bernhard zustimmen. Aber du hast gut begründet, warum du davon abweichen möchtest. Unter WinForms gibt es KeyDown- und KeyUp-Ereignis, bei KeyEventArgs kann das Zeichen in Verbindung mit Control abgefragt werden. So etwas sollte es doch auch unter WPF geben.

        Jürgen

        Comment


        • #5
          Originally posted by Jürgen Thomas View Post
          Hallo,

          eigentlich möchte ich Bernhard zustimmen. Aber du hast gut begründet, warum du davon abweichen möchtest. Unter WinForms gibt es KeyDown- und KeyUp-Ereignis, bei KeyEventArgs kann das Zeichen in Verbindung mit Control abgefragt werden. So etwas sollte es doch auch unter WPF geben.

          Jürgen
          Serwus Jürgen,

          danke Dir für Deine Antwort. Also diese Ereignisse verwende ich zum Ummodeln der Eingaben momentan auch. Nur wird das KeyDown Event bei Strg+A offensichtlich nicht ausgelöst. Ich hatte eine ähnlich Anwendung schonmal unter den normalen Windows Forms geschrieben. Dort wurde beim drücken von Strg+A zwar auch der gesamte Text markiert, aber dennoch der KeyDown Evenhandler von mri durchlaufen. Das scheint bei WPF anders zu sein. :-(
          Zuletzt editiert von Schlonzo; 23.03.2009, 11:20.

          Comment


          • #6
            Also ich habs jetzt hinbekommen. Habe statt dem KeyDown Eventhandler nun den PreviewKeyDown Eventhandler verwendet. Der kommt zum tragen bevor das Select All ausgeführt wird.

            So sieht das jetzt aus:

            Code:
                    private void textBoxEntry_PreviewKeyDown(object sender, KeyEventArgs e) {
                        e.Handled = true;
                        if (Keyboard.Modifiers == (ModifierKeys.Shift | ModifierKeys.Control) && e.Key == Key.A) {
                            textBoxEntry.AppendText("Á");
                            textBoxEntry.Select(textBoxEntry.Text.Length, 0);
                        }
                        else if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.A) {
                            textBoxEntry.AppendText("á");
                            textBoxEntry.Select(textBoxEntry.Text.Length, 0);
                        }
                        else if (Keyboard.Modifiers == (ModifierKeys.Shift | ModifierKeys.Control) && e.Key == Key.E) {
                            textBoxEntry.AppendText("É");
                            textBoxEntry.Select(textBoxEntry.Text.Length, 0);
                        }
                        else if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.E) {
                            textBoxEntry.AppendText("é");
                            textBoxEntry.Select(textBoxEntry.Text.Length, 0);
                        }
                        else if (Keyboard.Modifiers == (ModifierKeys.Shift | ModifierKeys.Control) && e.Key == Key.O) {
                            textBoxEntry.AppendText("Ó");
                            textBoxEntry.Select(textBoxEntry.Text.Length, 0);
                        }
                        else if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.O) {
                            textBoxEntry.AppendText("ó");
                            textBoxEntry.Select(textBoxEntry.Text.Length, 0);
                        }
                        else {
                            e.Handled = false;
                        }
                    }
            Danke nochmal für eure Hilfe

            Comment


            • #7
              Hallo,

              ich glaube, dein Code kann noch vereinfacht werden (und er müsste eigentlich einen Fehler enthalten).

              PreviewKeyDown hätte ich gleich erwähnen sollen; bei Standard-Tastenkombinationen kann KeyDown unzureichend sein. Aber dazu gehören auch PreviewKeyDownEventArgs, nicht KeyDownEventArgs.

              Die Modifizierer Control, Shift, Alt sind in diesen EventArgs enthalten, können also auch direkt abgefragt werden. Außerdem kannst du denselben EventHandler für mehrere TextBoxen nutzen. Ich schlage also so etwas vor:
              Code:
              private void allTextBoxes_PreviewKeyDown(object sender, KeyEventArgs e) {
                  string input = String.Empty;
                  if (e.Shift && e.Control && e.Key == Key.A)  {
                      input = "Á";
                  } else if { ... }
              
                  //  gemeinsame Auswertung aller Zweige, weil sich alles wiederholt
                  e.Handled = ! String.IsNullOrEmpty(input);
                  if (e.Handled) {
                      TextBoxBase box = sender as TextBoxBase;
                      if (box != null) {    //  nur zur Sicherheit
                          box.AppendText(input);
                          box.Select(box.Text.Length, 0);
                      }
                  }
              }
              Verbesserungsvorschlag: Wenn du SelectStart abfragst, kannst du statt AppendText auch Text.Insert realisieren.

              Gruß Jürgen

              PS. Allgemeiner Hinweis: Wenn sich (wie hier) eine oder mehrere Code-Zeilen mindestens zweimal wiederholen, sollten alle Alarmglocken schrillen - das schreit nach einer Umstellung des Codes.

              Comment


              • #8
                Jou danke Dir Jürgen,

                das ist eine sinnvolle Optimierung. Werde ich so einbauen.

                Den Stub des PreviewKeyDown Eventhaldnlers hat mir das Studio so generiert. Ich nehme also an, dass es so passt und läuft auch augenscheinlich ohne Probleme. Danke trotzdem für den Hinweis.

                Comment

                Working...
                X