Mehrere TextBoxen mit einem KeyPressEvent

  • WPF

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    @Beany
    Eine Textbox hat standartweise den Datentyp "Textbox".

    Beany schrieb:

    Gibt es bei KeyPress/KeyUp/KeyDown auch


    Ja, aber nicht nach Eingabe jedes einzelnen Zeichens, oder?

    Doch

    Edit:
    Wenn du auf die Tastatur drückst wird KeyPress ausgeführt.
    Wenn du auf eine Tastedrückst, wird KeyDown ausgeführt.
    Wenn du die Taste wieder loslässt, wird KeyUp ausgeführt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()

    a.b_om schrieb:

    Eine Textbox hat standartweise den Datentyp "Textbox".

    Sorry, vieleicht bin ich kleinlich, aber "Textbox" ist kein Datentyp.

    Die Textbox ist ein Control.
    Das Property Text ist vom Typ String

    Ein Control hat in der WPF ein Default-Property welches im Falle der Textbox das Text-Property ist.
    Wollte ich nur klarstellen, nicht das sich der TE das so merkt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo @Nofear23m,

    Sorry, vieleicht bin ich kleinlich, aber "Textbox" ist kein Datentyp.

    Die Textbox ist ein Control.

    Das Property Text ist vom Typ String

    Ein Control hat in der WPF ein Default-Property welches im Falle der Textbox das Text-Property ist.

    Wollte ich nur klarstellen, nicht das sich der TE das so merkt.


    Nein, denke ich nicht...
    2 Posts vorher schrieb ich das aber auch, (wenn vielleicht auch nicht ganz so klar ;) )
    Ich sehe das genauso, nur dass ich ein Control immer als Object verstanden habe...
    Irritationen habe ich evtl. damit ausgelöst, dass ich schrieb der Datentyp sei Double - damit meinte ich aber den späteren Wert den ich ausgeben möchte, indem ich den String konvertiere... (Das habe ich mit VBA aber gefühlt schon 1.000x gemacht und sollte auch mit vb.net kein Problem sein, oder?)

    Soweit ich das richtig verstehe ist TextBox ein Control vom Typ Object, der Standard-Datentyp, der daraus hervorgeht ist "String"... Diesen kann ich aber später mit "CDbl" umwandeln... Soweit alles richtig, oder?

    Im Kern geht es aber darum nicht:
    Im Moment versuche ich das über eine andere Klasse hinzubekommen, wo ich ein CustomEvent bauen möchte...
    Doch iewie bin ich dafür noch nicht so richtig hinter die Feinheiten von vb.net gestiegen... In VBA bekomme ich das hin... Leider finde ich im Netz jedoch keine wirklich hilfreichen Infos dazu...

    Gruß,
    Beany
    Hallo

    Ich werde sowohl aus dem Eingangspost als auch aus den darauffolgenden Posts nicht wirklich schlau bzw. glaaube ich das überhaupt der ansatz der falsche für die WPF ist. Unter WPF geht so einiges etwas anders - nämlich meist besser - als unter WinForms oder gar VBA.

    Beschreib do bitte überhaupt mal mit ein paar Worten und/oder einem Screenshot oder ähnlichem was du überhaupt machen willst. Oft Fragen Leute nach einer Lösung eines Problems, derweil ist der Ansatz überhaupt das problem da es einfach schlicht der falsche Ansatz ist. Vieleicht kann ich dir dann besser Helfen.

    Grüße
    Sascha

    Edit:

    a.b_om schrieb:

    Mach es doch einfach in der Klasse hinter der Form.

    Ich muss wieder. Bitte nicht winForms mit WPF zusammenwürfeln, da kommt es hier im Forum gerne zu verwirrung. In der WPF gibt es keine Form(s). Nur Window(s). Sorry, ich muss weil wir was dies betrifft oft schon verwirrung hatten. Ich weis, die Fragestelung ist nicht unbedingt WPF spezifisch (noch nicht) aber dennoch arbeitet er ja mit der WPF.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Nofear23m,

    ja, ich verstehe...
    Ich habe mich für WPF entschieden, weil mir die Design-Möglichkeiten sehr gut gefallen und sich das Grid an jeweilige Bildschirmgrößen so schön anpassen lässt...
    Mit dem Designer - also mit XAML an sich - habe ich mich mal etwas intensiver beschäftigt... Ich vermutete bereits, dass das Programmieren dann etwas veränder vonstatten gehen wird...
    Ich habe auch mal etwas über das Binding gelernt, aber das ist bereits etliche Jahre her und ich muss das alles wieder auffrischen... (In einem anderen Thread habe ich da etwas von dir gelesen, wie das mit Interfaces funktioniern kann, steige aber noch nicht wirklich durch...)

    Screenshot okay, aber was soll ich da zeigen?
    Letztlich geht es um die Behandlung von TextBoxen mittels WPF und vb.net

    Gruß,
    Beany

    Beany schrieb:

    Screenshot okay, aber was soll ich da zeigen?
    Letztlich geht es um die Behandlung von TextBoxen mittels WPF und vb.net

    Das mit Screenshot war ein Beispiel. Was auch immer Hilft zu verstehen was du vorhast.

    Du schreibst das du das KeyPress Event in einer anderen Klasse Abfangen willst. Ja, aber warum? Was hast du vor bzw. was ist das Ziel. Was willst du erreichen.

    Beispiel: Ich habe eine Klasse welche Personen hält und möchte wissen wenn in einer Textbox etwas eingegeben wird um z.b. den Namen der Person in der Klasse aktualisieren kann. Ich weis das es nicht darum geht, aber es soll als Beispiel dienen. Denn Anhand deines Eingangsposts kann man nicht erraten was du vorhast und ich denke das die Herangehensweise eben falsch ist und ich dir auf den richtigen Weg Helfen will.

    Was WPF lernen Betrifft schau mal in meine Signatur.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Du schreibst das du das KeyPress Event in einer anderen Klasse Abfangen willst. Ja, aber warum? Was hast du vor bzw. was ist das Ziel. Was willst du erreichen.


    Hallo zusammen (@'a.b_om' und @Nofear23m... Da ihr in etwa dieselbe Frage gestellt habt ;) ),

    ich habe später mehrere TextBoxen, die lediglich Zahlen enthalten dürfen und eine bestimmte Formatierung erhalten, sobald die Box verlassen wird. Außerdem möchte ich gerne das "Enter" genauso behandelt wird wie "TAB", was standardmäßig nicht der Fall zu sein scheint... Da ich den Code nicht immer wieder neu schreiben möchte, dachte ich ihn mit der Auslagerung mehrfach verwenden zu können - so habe ich das in VBA jedenfalls auch jeweils gehandhabt... Das Projekt wird dadurch übersichtlicher und ich muss mich nur um eine Sache kümmern, wenn ich etwas verändern will, dass auf viele Einheiten Auswirkungen haben könnte...

    @Nofear23m: Ja, deine Signatur war mir bereits heute Morgen aufgefallen! Ganz bestimmt werde ich dort hineinschauen, doch bis jetzt habe ich gearbeitet und (noch) keine Zeit dazu gefunden... (Geht es denn dort "nur" um XAML oder auch um den Code behind? Letzteres wäre für mich in diesem Fall ja wichtiger :) )

    Was ich vorhabe?
    Ich baue ein Tool, mit dem man bestimmte Flächen maßstabsgetreu visualisieren kann... Man kann eine Gesamtfläche und Ausschnitte definieren... Die Flächen werden berechnet und der U-Wert gemäß den verwendeten Bauteilen wird bestimmt... Das alles funktioniert in Excel bereits recht prima - mir gefällt eben nur das Design dort nicht und ich bin an die vorgegebene Größe der Form gebunden... Mit WPF bin ich dahingehend deutlich flexibler und eine Methode die Zeichnugsfläche zu bemessen, damit der Maßstab angepasst werden kann, funktioniert auch dort schon sehr gut...

    Wenn ihr mir nun sagt, dass das Auslagern keinen Sinn macht - gut! (Ich hoffe nur, dass es dann nicht unübersichtlich wird, da ich weiß, dass es am Ende einige TextBoxen geben wird... Sollte es auch mit einfacheren Mitteln funktionieren, bin ich selbstverständlich für jeden Hinweis dankbar ;) !)
    Mit VBA konnte ich sowohl KeyPress- als auch MouseDown-Ereignisse super abfangen und mittels einer TextBoxklasse steuern... Das sparte eine Menge Tipparbeit und - wie bereits gesagt - musste ich jeweils nur an einer Stelle basteln, wodurch jedoch viele Fliegen mit einer Klappe geschlagen wurden... Mit vb.net und WPF in Kombi will mir das leider nicht gelingen ;( !

    Gruß,
    Beany

    Beany schrieb:

    Geht es denn dort "nur" um XAML oder auch um den Code behind? Letzteres wäre für mich in diesem Fall ja wichtiger )

    Nein, es geht (im weiteren dann) um alles Mögliche. Schau mal ins Inhaltsverzeichnis
    Aber.... verabschiede dich schon mal von CodeBehind. Auch wenn es Anfangs schmerzt. In der WPF wirst du nicht Glücklich damit. Da musst du zu WinForms wechseln. Die WPF "lebt" vom Binding. Hier verweise ich wieder auf meine Tutorialreihe. Super Sache aber man muss es eben lernen. Ist aber nicht so schwer.

    Beany schrieb:

    Da ich den Code nicht immer wieder neu schreiben möchte, dachte ich ihn mit der Auslagerung mehrfach verwenden zu können

    Das ist auch gut so, sollte man immer so machen. Don`t repeat yourself.

    Beany schrieb:

    Sollte es auch mit einfacheren Mitteln funktionieren, bin ich selbstverständlich für jeden Hinweis dankbar !)
    Mit VBA konnte ich sowohl KeyPress- als auch MouseDown-Ereignisse super abfangen und mittels einer TextBoxklasse steuern... Das sparte eine Menge Tipparbeit und - wie bereits gesagt - musste ich jeweils nur an einer Stelle basteln, wodurch jedoch viele Fliegen mit einer Klappe geschlagen wurden... Mit vb.net und WPF in Kombi will mir das leider nicht gelingen !

    Und genau deshalb meine ich das ich wissen muss was du machen willst. Das geht nämlich noch viel einfacher. Und zwar mit einem UserControl. Siehst du, deshlab wollte ich wissen was du machen willst, weil du dir so nocht viel mehr Arbeit sparst. Du kannst dir mittels eines UserControls ein eigenes Control zusammenstellen so wie du es willst und dann in deiner App überall verwenden. Super cool.

    Beispiel welches für dich passt:

    XAML:

    XML-Quellcode

    1. <UserControl x:Class="MySpecialTextbox"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:TextBoxUserControl"
    7. mc:Ignorable="d"
    8. d:DesignHeight="25" d:DesignWidth="200">
    9. <TextBox KeyUp="txt_KeyUp" Text="{Binding Value, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MySpecialTextbox}}}"/>
    10. </UserControl>


    Und der Code:

    VB.NET-Quellcode

    1. Public Class MySpecialTextbox
    2. Public Property Value As Integer
    3. Get
    4. Return CInt(GetValue(ValueProperty))
    5. End Get
    6. Set(ByVal value As Integer)
    7. SetValue(ValueProperty, value)
    8. End Set
    9. End Property
    10. Public Shared ReadOnly ValueProperty As DependencyProperty =
    11. DependencyProperty.Register("Value",
    12. GetType(Integer), GetType(MySpecialTextbox),
    13. New PropertyMetadata(0))
    14. Private Sub txt_KeyUp(sender As Object, e As KeyEventArgs)
    15. If e.Key = Key.Enter Then DirectCast(sender, TextBox).MoveFocus(New TraversalRequest(New FocusNavigationDirection()))
    16. End Sub
    17. End Class


    Ja, und das kann jetzt bereits alles was du brauchst. Ich bin jetzt mal von ganzen Zahlen ausgegangen ist aber leicht anpassbar. Einfach den Datentyp des DependyProperties ändern. Was ist ein Dependency Property? Wieder.... Meine Tutorialreihe.

    Anbei auch ein Testprojekt und ein Screenshot davon.
    Falls du Fragen hast kannst du gerne Fragen, ich lege dir nur wirklich ans Herz dich mit Binding zu beschäftigen. Je früher desto besser. Du wirst es dir selbst danken.

    Grüße
    Sascha
    Bilder
    • uclTest.png

      53,33 kB, 697×438, 63 mal angesehen
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo @Nofear23m,

    das hat mir bereits sehr gut weitergeholfen... (Gestern Abend habe ich begonnen mir deine WPF-Reihe anzusehen... Gefällt mir sehr gut :thumbsup: , obwohl ich die Erklärungen der Einführung bereits kannte... Dennoch halte ich es für sinnvoll alles anzuschauen, weil ja möglicherweise etwas dazwischen sein könnte, was mir nicht geläufig ist!)

    Deinen Code habe ich auch soweit nachvollziehen können - (dazu musste ich zwar die aktuelle VS Version herunterladen, weil deine Anwendung sich mit VS 2010 nicht laden ließ; hat aber soweit alles funktioniert!)

    Jetzt habe ich nur ein kleines Problem mit den Namespaces, da das Modul, in dem sich meine besagten Textboxen befinden, selbst ein UserControl ist... Diese lade ich bei Bedarf in das Main-Window... Leider kann ich das schlecht demonstrieren, da ich dann wieder alles zurückverändern müsste - (so läuft mein Programm im Moment jedoch nicht...)
    Also stattdessen die theoretische Erklärung:
    Das Main-Window beinhaltet TabControls als Children. Diese lade ich über das Menü bzw. alternativ mit entsprechenden Buttons hinzu. Im Grid habe ich dazu "Spaces" reserviert, in die entweder das eine oder eben andere UserControl geladen wird...
    Ich denke mir das so: Da bei dir MySpecialTextBox ein UserControl ist, kannst du darin mit "xmlns:local="clr-namespace:TextBoxUserControl"" verweisen, was ich leider nicht kann, weil meine Verweise, die ich unter "xmlns:local" aufführe das Main-Window beinhalten müssen. Zwei lokale Verweise gehen ja leider nicht, oder? Jedenfall verstehe ich (noch) nicht - (aber hoffentlich bald, aufgrund deiner Tuturials :D ) - wie ich die Verknüpfung zwischen den beiden UserControls hinbekommen soll.

    Falls du vorab eine Antwort darauf hast, wäre ich sehr dankbar!

    Gruß,
    Stefan

    P.S.: Ich habe jetzt noch einmal etwas rumgebastelt, was die Fehler auf einen einzelnen reduziert hat. Der Fehler lautet: "Value"-Eigenschaft wurde bereits von "MySpecialTextbox" registriert.


    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Beany“ ()

    Hallo

    Sorry, deiner Erklährung kann ich leider ur Bedint folgen.

    Am besten wäre es (solange du noch am lernen bist) das du eine kleine Test-Applikation machst. Ist ja schnell gemacht. Einfach eine kleine Applikation die controls so anordnet wie du es willst und standarddaten anzeigt.
    Verwende sowohl für Bilder als auch für ein Projekt bitte stets die Foreninterne Uploadfunktion!!! (Erweiterte Antwort -> Anhang)
    Was deinen Fehler betifft hast du vermutlich zwei identische DepenedencyProperties. Aber ich kann im Moment ohne den code zu sehen nur raten.

    Was dein Vorhaben betrifft kann ich dir nur wirklich mein Tutorial ans Herz legen. Insbesonders Binding, DependencyProperties und DataTemplates. Hierdurch sparst du dir extrem viel Arbeit.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##