2016-05-23 3 views
1

Ich habe ein WinForms-Projekt, wo ich persischen Text in ein TextBox-Steuerelement eingeben. Ich habe gesehen   Verwendung in HMTL-Seiten. Was ich jedoch hier brauche, ist, dass ich eine Tastenkombination festlegen möchte. Wenn die Tastenkombination gedrückt wird, fügt die TextBox dem Text ein geschütztes Leerzeichen hinzu und der Benutzer kann den Rest eingeben. Dieses Element,  , wirklich wichtig ist für einige Sprachen wie Persisch, wie Sie im folgenden sehen können:Wie benutze nicht-brechenden Platz in TextBox

Normaltext:

کتابخانه های الکترونیکی

Mit Non-breaking Raum:

کتابخانههای الکترونیکی

Wie kann ich das in WinForms verwenden?

+0

Aber zwei Wörter sind gleich. Was meinst du? – mohsen

+0

Verwenden Sie stattdessen eine RichTextBox? Besonders bei Verwendung von Shortcuts. – TravisWhidden

+0

@mohsen Sie sind nicht die gleichen speziell bei einer Suche. Nicht brechender Platz ist NICHT ein voller Platz. – Medise

Antwort

0

Sie können die KeyPress Ereignis fangen und das Zeichen einfügen Sie wollen an der Einfügemarke wie folgt aus:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Space && 
     ModifierKeys == Keys.Control) 
    { 
     char nbrsp = '\u2007';     // non-breaking space 
     char zerospace = '\u200B';   // zero space 
     char zerospacenobinding = '\u200C'; //zero space no character binding 
     char zerospacebinding = '\u200D'; // zero space with character binding 

     int s = textBox1.SelectionStart; 
     textBox1.Text = textBox1.Text.Insert(s, nbrsp.ToString()); 
     e.Handled = true; 
     textBox1.SelectionStart = s + 1; 
    } 
} 

Beachten Sie, dass während Word verwendet I Ctl-Shift-Space Diese Kombination kann auch zwischen Right-To-Left und Left-To-Right wechseln. Lassen Sie uns stattdessen Ctrl-Space verwenden.

Beachten Sie auch, dass während KeyDown einen e.Handled Parameter hat, die Einstellung auf true das eingegebene Zeichen nicht unterdrückt. Also müssen wir das KeyPress Ereignis verwenden.

+0

Diese direkte Antwort hat nicht funktioniert. Wenn ich das nutze, habe ich gerade normalen Platz für nbrsp und einen Abkömmling von 'i' für slimnbrsp bekommen. Der Trick, den ich verwendet habe, war folgender: Ich tippte ein nbssp in das Microsft-Wort, kopierte es in eine String-Variable und ersetzte es für nbrsp.toString(). Nun, es funktioniert jetzt genau so, wie ich es will. Vielen Dank. – Medise

+0

Es gibt noch eine andere Sache, die ich besser erwähnen sollte. Es scheint, dass ich versehentlich NBSP anstelle von [Null-Breite-Raum] (https://en.wikipedia.org/wiki/Zero-width_space) verwendet. Ich bin mir aber immer noch nicht sicher. Hoffe man kann diese Antwort benutzen. – Medise

+0

Entschuldigung für die falschen Codes. Bitte sehen Sie mein Update. Ich bin nicht sicher, welche Zeichen Sie wirklich brauchen, oder wenn Sie vielleicht eine andere Abkürzung wählen sollten, wenn Sie für die Bindung-Null-Raum gehen .. – TaW

1

Sie KeyPress Ereignis und dann beispielsweise umgehen kann, wenn der Benutzer Ctrl + Raum gedrückt wird, um den Raum mit einem \u200B Zeichen ersetzen:

using System.Windows.Forms; 
public class ExTextBox : TextBox 
{ 
    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if(e.KeyChar==' ' && ModifierKeys== Keys.Control) 
      e.KeyChar='\u200B'; 
     base.OnKeyPress(e); 
    } 
}