2011-01-14 15 views
1

Ich verwende C# 3.0 in der .NET Compact Framework 3.5 und das Programm muss auf Windows Mobile und Windows CE-Geräten ausgeführt werden können.C# Wie Übersetzen Tastatureingabe in Text

Ich habe meine eigene benutzerdefinierte Textfeldsteuerung erstellt. Es erbt nicht von TextBox oder einer anderen Art von Textfeldsteuerung, und dies ist keine Option. Wie kann ich Tastatureingaben in Text umwandeln, damit ich die Eigenschaft Text des Steuerelements richtig auf die Eingabe des Benutzers einstellen kann? Soweit es die Text-Eigenschaft betrifft, ist es nur eine gewöhnliche String-Variable und muss nicht weiter fortgeschritten sein als die TextBox.Text-Eigenschaft.

Ich weiß, eine Möglichkeit besteht darin, das KeyDown-Ereignis zu abonnieren und den KeyEventArgs-Parameter manuell für jedes Zeichen in Text zu übersetzen. Ich hoffe, dass es eine bessere Lösung gibt, bei der die Übersetzung von Tastatureingabe in Text für mich durch das Framework oder das Betriebssystem erfolgt. Danke.

Was wäre, wenn ich eine unsichtbare TextBox hätte, die alle Tastatureingaben kanalisiert und die Texteigenschaft der Steuerelemente so einstellen würde, dass sie bei jedem Textwechsel der TextBoxe entspricht. Gibt es eine Möglichkeit, das zu tun?

+0

ist es nicht möglich, eine echte Textbox in Ihrem Steuerelement einzubetten? Sie müssen nicht von einem – Simon

+0

erben Ich kann andere Steuerelemente in mir nicht einbetten, weil alle Zeichnung benutzerdefiniert ist. Mein Steuerelement heißt AlphaTextBox und es erbt vom AlphaLabel-Steuerelement aus der AlphaMobileControls-Bibliothek: http://alphamobilecontrols.codeplex.com/ –

Antwort

0

Ich denke, Sie suchen nach der KeyConverter Klasse. Ich weiß nicht, ob das Teil des kompakten Rahmens ist.

1

Das Übersetzen der Schlüssel in eine Zeichenfolge (kein Text, da Text für mich Dinge wie Schriftart, Größe, Position usw. bedeutet) ist nicht allzu komplex. Etwas geht wahrscheinlich einen langen Weg in Richtung es zu lösen:

public class MyControl : Control 
{ 
    private int m_cursorPos = 0; 

    public MyControl() 
    { 
     Text = string.Empty; 
     CursorPos = 0; 
    } 

    private int CursorPos 
    { 
     get { return m_cursorPos; } 
     set 
     { 
      if(value < 0) value = 0; 
      if(value > Text.Length) value = Text.Length; 

      m_cursorPos = value; 
     } 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     switch (e.KeyCode) 
     { 
      case Keys.Back: 
       if (CursorPos > 0) 
       { 
        CursorPos--; 
        Text = Text.Remove(CursorPos, 1); 
       } 
       break; 
      case Keys.Delete: 
       if (CursorPos < Text.Length - 1) 
       { 
        Text = Text.Remove(CursorPos, 1); 
       } 
       break; 
      case Keys.Left: 
       CursorPos--; 
       break; 
      case Keys.Right: 
       CursorPos++; 
       break; 
      default: 
       base.OnKeyDown(e); 
       break; 
     } 
    } 

    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (char.IsLetterOrDigit(e.KeyChar) 
       || char.IsSymbol(e.KeyChar) 
       || char.IsPunctuation(e.KeyChar) 
       || char.IsWhiteSpace(e.KeyChar)) 
     { 
      Text = Text.Insert(CursorPos, char.ToString(e.KeyChar)); 
      CursorPos++; 
      Debug.WriteLine(this.Text); 
     } 
    } 
} 

Natürlich müssen Sie dann entscheiden, wie das Rendering zu tun, und wenn Sie mehrzeilige Unterstützung haben, wird dies nicht behandelt Tasten auf/ab.