2017-01-20 3 views
0

Ich habe nach einer Möglichkeit gesucht, ein TextBox Format zu haben, während der Benutzer Daten eingibt.Auto Vollständige Formatierung für TextBox?

Ich habe einen Hack gemacht, das tut, was ich will, aber es ist ein bisschen pingelig durch Dinge wie, wenn Sie versehentlich zwei Tasten drücken, auf einmal, die mit den if Aussagen schrauben kann und bei dem Versuch, die Zeichenfolge über Delete Key durch das löschen Benutzer.

Wie auch immer, das ist nicht das Problem, und das ist der Code, den ich jetzt benutze:

die Methoden dieser Klasse aufrufen, Die erste Methode fügt Komma auf den String und die zweite Methode überprüft, ob ein Komma Am Ende, wenn der Benutzer das Tippen beendet hat.

class BonusData 
{ 
    public class DoDataTextBox 
    { 
     public static void AutoComplete(TextBox textBox, int counter) 
     { 
      if (textBox.Text.Length - counter == 3) 
      { 
       textBox.Text = textBox.Text + ","; 
       textBox.SelectionStart = textBox.Text.Length; 
      } 
      else if (textBox.Text.Length - counter == 7) 
      { 
       textBox.Text = textBox.Text + ","; 
       textBox.SelectionStart = textBox.Text.Length; 
      } 
      else if (textBox.Text.Length - counter == 11) 
      { 
       textBox.Text = textBox.Text + ","; 
       textBox.SelectionStart = textBox.Text.Length; 
      } 
     } 

     public static void CheckLastCharacter(TextBox textBox) 
     { 
      if (textBox.Text.Length < 2) return; 
      if (textBox.Text.Substring(textBox.Text.Length - 1) != ",") return; 
      { 
       textBox.Text = textBox.Text.Substring(0, textBox.Text.Length - 1); 
      } 
     } 
    }  
} 

Und die Event-Handler,

private void SecondMonthRowOne_OnKeyUp(object sender, KeyEventArgs e) 
{ 
    int counter = 0; 
    if (IsText) 
    { 
     counter = 1; 
    } 
    BonusData.DoDataTextBox.AutoComplete((TextBox)sender, counter); 
} 


private void SecondMonthRowOne_OnGotFocus(object sender, RoutedEventArgs e) 
{ 
    if (e.ToString() != String.Empty) return; 
    IsText = true; 
} 


private void SecondMonthRowOne_OnLostFocus(object sender, RoutedEventArgs e) 
{ 

    BonusData.DoDataTextBox.CheckLastCharacter((TextBox)sender); 
    IsText = false; 
} 

, die ein Ergebnis wie dieses gibt,

999.999.999

Wie ich schon sagte, es 98% der Zeit arbeitet, aber ich hatte gehofft, dass es einen anderen Weg gibt, dies in WPF zu tun. Ich habe weit und breit gesucht, aber ich weiß nicht einmal, wie so etwas heißen soll.

+0

Gibt es einen besonderen Grund, dass Sie eine TextBox anstelle einer ComboBox mit 'IsEditable =" True "' verwenden? – lokusking

+0

@lokusking, vergib meine Unwissenheit, aber was ist der Vorteil davon in dieser Situation? Danke – KyloRen

+0

Mein schlechtes. Deine Frage falsch gelesen. Ich dachte zuerst, Sie wollen eine Art vordefinierte Auswahl wie in den alten Tagen Winforms 'Autocomplete – lokusking

Antwort

0

ohne fremde addins ich mit dieser fand wirklich gut zu funktionieren,

Dies wird eine Comma jeder dritte Zeichen hinzufügen und ermöglichen Benutzern Zeichen einer nach dem anderen zu löschen.

Das TextBox Format wird wie folgt aussehen,

999.999.999.999

enter image description here

Der Code,

public class DoDataTextBox 
    { 
     public static void AutoCompleteStringBuild(TextBox textBox) 
     { 
      string endResult = null; 

      string replace = Reverse(textBox.Text).Replace(",", ""); 
      int count = 1; 
      char[] value = replace.ToCharArray(); 

      foreach (var car in value) 
      { 
       if (count % 3 == 0) 
       { 
        endResult = String.Concat(endResult, car); 
        if (value.Length != count) 
        { 
         endResult = String.Concat(endResult, ","); 
        } 
        count++; 
       } 
       else 
       { 
        endResult = String.Concat(endResult, car); 
        count++; 
       } 
      } 
      if (endResult == null) return; 
      string textBoxResult = Reverse(endResult); 
      textBox.Text = textBoxResult; 
     } 

     public static string Reverse(string stringVal) 
     { 
      char[] charArray = stringVal.ToCharArray(); 
      Array.Reverse(charArray); 
      return new string(charArray); 
     } 

     public static void IsDeleteKey(TextBox textBox, KeyEventArgs e) 
     { 
      textBox.SelectionStart = e.Key == Key.Delete ? 0 : textBox.Text.Length; 
     } 
    } 

Und der Event-Handler,

private void TextBoxOne_OnKeyUp(object sender, KeyEventArgs e) 
{ 
    BonusData.DoDataTextBox.AutoCompleteStringBuild((TextBox)sender); 
    BonusData.DoDataTextBox.IsDeleteKey((TextBox)sender, e); 
} 

Derzeit ist dies der beste Weg, den ich gefunden habe, dies zu tun.

0

Ich empfehle Ihnen stattdessen "WPF TextBox AutoComplete" zu verwenden. Es ist ein WPF-Verhalten, das in ein NuGet-Paket eingebettet ist.

Sie können dieses Paket einfach zu Ihrem Projekt hinzufügen, indem Sie dies mit dem NuGet Package Manager für Ihr WPF-Projekt hinzufügen. Dieses NuGet-Paket ist auch Open Source, daher können Sie es weiter an Ihre Bedürfnisse anpassen.

Der Quellcode wird auf dieser GitHub Repo gehostet: https://github.com/Nimgoble/WPFTextBoxAutoComplete

ANMERKUNG: Ich habe nicht vollständig diese WPF Bibliothek gegen .NET 4.6 getestet. Die Bibliothek wird gegen .NET 4.5 als Ziel kompiliert. Aber soweit ich weiß, ist es zu 100% kompatibel mit WPF in .NET 4.6.

+0

Danke für die Antwort, eine Frage, wie würde die Bindung 'IEnumerable ' aussehen, um eine Zeichenfolge wie folgt aussehen '999.999.999' – KyloRen

+0

@ KyloRen-Bindung an IEnumerable kann nicht direkt an eine TextBox gebunden werden, da IEnumerable eine Auflistung ist. Bitte lesen Sie diesen MSDN Library Link für WPF Datenbindung in .NET 4.5/4.6: https://msdn.microsoft.com/en-US/library/ms754130(v=vs.110).aspx –

+0

@KyloRen Wenn Sie möchten Wenn die TextBox mit Tausendertrennzeichen formatiert sein soll, können Sie die Daten einfach formatieren, bevor sie mit String.Format in der TextBox angezeigt werden. Bitte markieren Sie meine Antwort als Antwort auf Ihre Frage zu AutoVervollständigen :) –