2017-12-22 19 views
0

Ich bin neu in der Programmierung und immer noch ziemlich schlecht, aber leider konnte ich nichts finden, was mir helfen könnte.C# - Text erscheint Buchstabe für Buchstabe in einem Etikett?

Ich wollte eine kleine Dialogbeschriftung für dieses Spiel haben, das wir für Kinder machen, die Buchstaben erscheinen eins nach dem anderen in einem Etikett und nach dem Drücken eines Knopfes erhalten Sie den nächsten Dialog. Bisher habe ich diese Klasse SlowWriter:

public class SlowWriter 
    { 

     public static void Write(string text) 
     { 
      Random rnd = new Random(); 
      foreach (char c in text) 
      { 
       Console.Write(c); 
       Thread.Sleep(rnd.Next(30, 60)); 
      } 
     } 
    } 

Aber ich kann wirklich nicht herausfinden, wie diese Methode in einem Etikett angezeigt wird? Denn ich habe dies in meinem Button Klickereignis

aber dies wird es nur in der Ausgabe thingy und nicht das Etikett anzeigen? Und ich kann es nicht einfach in eine Saite umwandeln und diese im Label anzeigen.

+2

Welches Kind von Label? Ist das Winforms? WPF? ...? – itsme86

+0

"Ausgabe Thingy" ist in Ihrem Fall Konsole, da Sie auf der Konsole drucken. –

Antwort

0

Die Console.Write (c) sendet die Zeichen an die Konsole statt eine Beschriftung.

In Ihrer Write-Funktion können Sie einen Parameter für die Beschriftung hinzufügen, an die Sie schreiben möchten, und einen StringBuilder verwenden, um Zeichen anzufügen.

Sie möchten, dass diese Write-Funktion asynchron ausgeführt wird, damit Ihr Thread erst dann gebunden wird, wenn die gesamte Zeichenfolge geschrieben wurde. Daher erstellen wir eine Aufgabe und führen sie aus. In diesem Fall müssen Sie Invoke verwenden, um den UI-Thread aufzurufen, um den Beschriftungstext zu ändern.

Diese Lösung ist für WinForms, aber die allgemeine Idee ist da.

public class SlowWriter 
{ 
    public static void Write(string text, Label lbl) 
    { 
     Task.Run(() => 
     { 
      Random rnd = new Random(); 
      StringBuilder sb = new StringBuilder(); 
      foreach (char c in text) 
      { 
       sb.Append(c); 
       if (lbl.InvokeRequired) 
       { 
        lbl.Invoke((MethodInvoker)delegate { lbl.Text = sb.ToString(); }); 
       } 
       else 
       { 
        lbl.Text = sb.ToString(); 
       } 
       Thread.Sleep(rnd.Next(30, 60)); 
      } 
     }); 
    } 
} 

Damit vergeht die einzige Änderung der Schaltfläche Click-Ereignis in der Beschriftung, die Sie schreiben wollen, so wird es in etwa so aussehen, wo „LBL“ ist der Variablenname des Objekts gewünschte Etikett .

SlowWriter.Write("Lorem Ipsum", lbl); 
2

Angenommen, Sie WinForms verwenden können Sie eine SlowLabel Kontrolle erstellen, die Sie auf dem Formular platzieren können und wie jede andere Form verwendet werden. Es verwendet eine Timer, die mit Cross-Thread-Operationen der Benutzeroberfläche umgehen kann. Und für die zu verarbeitenden Zeichen wird ein IEnumerator<char> verwendet, der in der Zeichenfolge vorhanden ist.

public class SlowLabel:Label 
{ 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); // Ticks now and then 

    IEnumerator<char> text = null; // holds the characters that still need to show up 

    static Random r = new Random(); // guarantee randomness 

    public SlowLabel() 
    { 
     timer.Interval = r.Next(30,60);  // when is the next tick 
     timer.Enabled = false;    // let's not start now 
     timer.Tick += (s,e) => {    // do one character 
      base.Text += text.Current;  // Current has charactwer to Add 
      timer.Interval = r.Next(30,60); // random next run 
      timer.Enabled = text.MoveNext(); // or we stop if no more charcters 
     }; 
    } 

    public override string Text 
    { 
     set 
     { 
      text = value.GetEnumerator();  // get the charcters to process 
      base.Text = String.Empty;   // start empty 
      timer.Enabled = text.MoveNext(); // tell the timer to start 
     } 
    } 
} 

Wenn Sie es auf Ihrem Formular abgelegt haben, können Sie es wie so verwenden:

private void check_Click(object sender, EventArgs e) 
{ 
    l1.Text = "The quick brown fox jumps over the lazy dog"; 
    l2.Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 
} 

Welche wird Ihnen dieses Ergebnis:

slow label with characters appearing

Verwandte Themen