none
WPF Mehrzeilige TexBox, für ein und Ausgabe vom COM Port Daten verwenden RRS feed

  • Frage

  • Hallo an Alle,

    ich würde gerne eine WPF TextBox die Return akzeptiert als IO für meinen COM Port verwenden.

    Den Text den ich in die erste Zeile schreibe, sollte nach betätigen der ENTER-Tast in den Port geschrieben werden, nun habe ich mittels

     private void OnKeyDownHandler(object sender, KeyEventArgs e)
    
      {
     if (e.Key == Key.Tab)
                {
     textBox1.Text =  "hallo";
    }
    }

    herausgefunden, das wenn ich

    AcceptsReturn="true"

    verwende, ENTER nicht funktioniert.

    Frage 1: Wie bekomme ich das mit dem ENTER hin?

    Frage 2: Wie schaffe ich es das er die eingegeben Zeile in der TextBox liest, und die Antwort vom Port eins drunter setzt, ich wieder einen Befehl schreiben kann, und er wieder zurücksendet usw. Also genauso wie dies PORT Tools die man kennt.

    Viele Dank im voraus


    Freitag, 9. Mai 2014 19:57

Antworten

  • Hallo und Danke für die Antwort,

    da es mir an dem Abend keine Ruhe lies, habe ich es jetzt so gelöst.

    Die TextBox auf AcceptsReturn=false gesetzt, dann im

    private void OnKeyDownHandler(object sender, KeyEventArgs e)
            {
                
    
                if (e.Key == Key.Enter && port.IsOpen)
                {
    
                    
    
                    port.WriteLine(textBox1.Text);
                    textBox1.Text += "\r\n" + port.ReadLine() + "\n";
                    textBox1.Select(textBox1.Text.Length, 0);
                    
                    
                 } 
               
               
    
            }

    und siehe das es klappt ;D

    • Als Antwort markiert Berg2381troll Dienstag, 13. Mai 2014 20:33
    Dienstag, 13. Mai 2014 16:51

Alle Antworten

  • Hallo,
    sobald AcceptsReturn auf true gesetzt wird, kann auch ein mehrzeiliger Text eingegeben werden. KeyDown spricht jedoch nicht auf die Enter-Taste an. Dafür musst du PreviewKeyDown benutzen.

    Ich würde an deiner Stelle jedoch zweigeteilt arbeiten. Eine ListBox mit dem verlauf und eine TextBox für neue Nachrichten. Von der TextBox abonnierst du nur das PreviewKeyDown-Event. Dort wird beim drücken der Enter-Taste der Inhalt der TextBox gelehrt und in einer Liste gespeichert. Außerdem wird der Text über den Port gesendet. Das hat den Vorteil, das man das bereits Gesendete nicht nachträglich editieren kann.

    public MainWindow()
    {
        this.Strings = new ObservableCollection<string>(); this.DataContext = this;//Damit die ListBox die Liste findet InitializeComponent(); } public ObservableCollection<string> Strings { get; set; }//Die Liste mit den Strings private void TextBox_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter && Keyboard.Modifiers == ModifierKeys.None)//Bei Shift+Enter einen zeilenumbruch einfügen { var tb = sender as TextBox; //Hier den Port ansprechen this.Strings.Add(tb.Text);//Text speichern tb.Text = "";//Text zurück setzen e.Handled = true;//Event nicht weiter leiten > keine neue Zeile } }

    Im XAML könnte es dann so aussehen:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="70"/>
        </Grid.RowDefinitions>
        <ListBox ItemsSource="{Binding Strings}"/>
        <TextBox Grid.Row="1" AcceptsReturn="True" PreviewKeyDown="TextBox_KeyDown"/>
    </Grid>

    Vom verhalten her ist es nun ein wenig wie Skype.

    Wenn du nun Daten vom Port empfängst, kannst du den Text einfach zur Strings-Collection hinzufügen. Die ListBox aktualisiert sich durch die Bindung selbstständig.

    Wenn du willst kannst du auch mit einem eigenen Typ statt mit String arbeiten. Dadurch kannst du dann in der ListBox leichter anzeigen von wem was ist. Das geht über ein ItemTemplate (Hier ein einfaches Beispiel).

    Da keine deiner Fragen speziell zum senden über einen Port geht, gehe ich jetzt nicht weitere darauf ein.
    Dafür wäre vielleicht auch eine vollkommen neue Frage angebracht, um die UI-Fragen von den Senden-Fragen besser auseinander halten zu können.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 9. Mai 2014 20:36
  • Hallo und Danke für die Antwort,

    da es mir an dem Abend keine Ruhe lies, habe ich es jetzt so gelöst.

    Die TextBox auf AcceptsReturn=false gesetzt, dann im

    private void OnKeyDownHandler(object sender, KeyEventArgs e)
            {
                
    
                if (e.Key == Key.Enter && port.IsOpen)
                {
    
                    
    
                    port.WriteLine(textBox1.Text);
                    textBox1.Text += "\r\n" + port.ReadLine() + "\n";
                    textBox1.Select(textBox1.Text.Length, 0);
                    
                    
                 } 
               
               
    
            }

    und siehe das es klappt ;D

    • Als Antwort markiert Berg2381troll Dienstag, 13. Mai 2014 20:33
    Dienstag, 13. Mai 2014 16:51
  • Hallo,
    das sollte natürlich funktionieren, nur kannst du alles in der TextBox nach belieben verändern. Das ist meiner Meinung anch ein nicht ganz unwichtiger Nachteil.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 13. Mai 2014 18:16