HEX Werte bei Abfrage?

  • WPF

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Solaris.

    HEX Werte bei Abfrage?

    Hallo,

    ich habe kürzlich mit WPF zu programmieren begonnen und bin etwas überrascht das einige Dinge die einfach sein sollten sich als doch als recht umständlich herausstellen.

    Ich möchte eine kleine Abfrage durchführen die wie folgt aussieht.

    VB.NET-Quellcode

    1. If label1.forecolor = color.from?(#ff92921) Then
    2. label1.content = "test123"
    3. End If


    Wie bekomme ich das korrekt hin? Wichtig wäre tatsächlich mit Hex-Werten arbeiten zu können.


    Omega1
    @Omega1 So was:

    VB.NET-Quellcode

    1. If Label1.ForeColor = Color.FromArgb(&H1234) Then

    =====
    Hex-Werte sind lediglich die String-Repräsentation eines numerischen Wertes, wie die Dezimaldarstellung auch.

    VB.NET-Quellcode

    1. If Label1.ForeColor = Color.FromArgb(4660) Then
    ist äquivalent.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sicher, dass Du WPF verwendest? Labels haben keine Property namens forecolor, sondern Foreground. Und das ist auch keine Farbe, sondern ein Brush. Der Grund ist einfach: Brushes können alles mögliche anzeigen, und nicht nur eine einzelne Farbe:


    Verwende Anzeige-Controls nicht zum Zwischenspeichern von Daten. Das gilt in WinForms genauso wie in WPF. Was bedeutet es bei Dir, wenn label1.forecolor = color.from?(#ff92921) ist? Lege z.B. eine Property in der Klasse an, die genau diesen Zweck erfüllt. Wenn sich der Wert der Eigenschaft ändert, dann veränderst Du das Label entsprechend.
    Beispiel:

    VB.NET-Quellcode

    1. Public Class Window1OderSo
    2. Dim _FrobnicationEnabled As Boolean = False
    3. Public(oder Private) Property FrobnicationEnabled As Boolean
    4. Get
    5. Return _FrobnicationEnabled
    6. End Get
    7. Set(value As Boolean)
    8. _FrobnicationEnabled = value
    9. If value Then
    10. DeinLabel.Foreground = Irgendwas
    11. Else
    12. DeinLabel.Foreground = IrgendwasAnderes
    13. End If
    14. End Set
    15. End Property
    16. '...
    17. End Class

    Veränderst Du die Eigenschaft, wird der Vordergund des Labels automatisch mit verändert.

    Im nächsten Schritt würde man dann MVVM verwenden und den Vordergrund des Labels an eine Property im ViewModel binden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    wenn ich folgendes Schreibe:

    VB.NET-Quellcode

    1. If Label1.Foreground = Color.FromArgb(1, 1, 1, 1) Then
    2. label1.content = "test123"
    3. End If


    bekomme ich diese Fehlermeldung

    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "=" mit diesen Argumenten aufgerufen werden kann:
    "Public Shared Operator =(color1 As System.Windows.Media.Color, color2 As System.Windows.Media.Color) As Boolean": Der Wert vom Typ "System.Windows.Media.Brush" kann nicht in "System.Windows.Media.Color" konvertiert werden. C:\Users\bertram illing\documents\visual studio 2010\Projects\FH_GUI_6\FH_GUI_6\MainWindow.xaml.vb 22 12 FH_GUI_6

    Omega1
    @Omega1 Trenne zunächst Deine Fehler:
    1. korrekter Zugriff auf Label.Foreground,
    2. Darstellung von Zahlen im Hex-Format.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    es ist tatsächlich ein WPF Projekt an dem ich arbeite - foreground ist die korrekte Bezeichnung der Eigenschaft.

    zunächst nochmal was zu meinem Vorhaben.
    Ich hab einen Text, dessen Farbe sich permanent verändert, sobald man drauf drückt.
    Die Farbe des Textes verändert sich aber auch wenn ich mit der Maus drüber(&-hinaus) fahre. Sobald der Text angeklickt wurde, soll es keine Veränderungen mehr geben können.
    Deswegen möchte ich eine if-Abfrage bezogen auf die aktuelle Text-Farbe machen, die mir Rückschlüssen zum Klickstatus des Textes ermöglicht.

    Folglich bräuchte ich etwas wie unten aufgeführt.


    VB.NET-Quellcode

    1. If Label1.Foreground = Color.FromArgb("#FF82C1EA") Then
    2. 'ein ARGB Wert läßt sich alternativ auch nicht vernüftig verwenden
    3. label1.content = "test123"
    4. End If



    Die Farbe festlegen geht schon:
    Label1.Foreground = New BrushConverter().ConvertFrom("#FF82C1EA")

    Nur den HEX-Wert auszulesen/vergleichen gestalltet sich als schwierig

    Omega1 schrieb:

    Nur den HEX-Wert auszulesen/vergleichen gestalltet sich als schwierig
    Dann hast Du den Post #2 ignoriert oder nicht verstanden. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    das kann sehr gut sein.
    Ich habe dein Beispiel bereits ausprobiert.
    Bin aber Gescheitert weil ich es nicht verstanden habe?!
    Ich habe verschieden Farbnotationsvarianten ausprobiert ohne erfolg.

    Ich würde mich freuen wenn folgender Quelltext entsprechend abegeändert werden könnte.

    VB.NET-Quellcode

    1. If Label1.Foreground = Color.FromArgb("#FF82C1EA") Then
    2. label1.content = "test123"
    3. End If

    Omega1 schrieb:

    Ich würde mich freuen wenn folgender Quelltext entsprechend abegeändert werden könnte.
    OMG. :S

    VB.NET-Quellcode

    1. If Label1.ForeColor = Color.FromArgb(&H1234) Then
    2. If Label1.ForeColor = Color.FromArgb(4660) Then
    Diese beiden Zeilen Code sind äquivalent.
    Die obere verwendet einen Hex-Code, die untere den Dez-Code desselben numerischen Wertes.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany funktioniert so nicht, bitte berücksichtigen, dass es sich hier um ein WPF projekt handelt (forecolor/forground)



    Fehler 1 Für den Parameter "b" von "Public Shared Function FromArgb(a As Byte, r As Byte, g As Byte, b As Byte) As System.Windows.Media.Color" wurde kein Argument angegeben. C:\Users\bertram illing\documents\visual studio 2010\Projects\FH_GUI_6\FH_GUI_6\MainWindow.xaml.vb 22 32 FH_GUI_6
    @RodFromGermany
    Beachte den Unterschied zwischen System.Drawing.Color (WinForms): msdn.microsoft.com/en-us/libra…r(v=vs.110).aspx#Anchor_2
    Und System.Windows.Media.Color (WPF): msdn.microsoft.com/en-us/libra…r(v=vs.110).aspx#Anchor_2

    @Omega1
    Nochmal aus Post #3 kopiert:
    Verwende Anzeige-Controls nicht zum Zwischenspeichern von Daten. Das gilt in WinForms genauso wie in WPF. Was bedeutet es bei Dir, wenn label1.forecolor = color.from?(#ff92921) ist? Lege z.B. eine Property in der Klasse an, die genau diesen Zweck erfüllt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko

    Das erstellen von Klassen gehört noch nicht zu meinen Stärken,
    könntest du mir einen einfachen alternativvorschlag machen, meinethalben auch mit einem anderen Farbraum.
    Ich habe beispielsweise die betreffende Farbe in Argb umgewandelt allerdings wird folgendes, wie schon erwähnt, auch nicht akzeptiert:

    VB.NET-Quellcode

    1. If Label1.Foreground = Color.FromArgb(1, 1, 1, 1) Then


    so langsam verzweifel ich an dieser Lappalie

    Omega1 schrieb:

    funktioniert so nicht

    @Niko Ortner Es geht hier nicht um den Zugriff auf WPF-Controls, sondern es geht hier um die Hexadezimaldarstellung numerischer Werte.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    If Label1.ForeColor = Color.FromArgb(&H1234) Then
    If Label1.ForeColor = Color.FromArgb(4660) Then

    Schau Dir nochmal die Links an und dann sag mir, warum das nicht funkioniert.
    Und doch, geht es schon. Denn man kann einer Property vom Typ Brush weder eine Color zuweisen, noch kann man die beiden vergleichen.

    @Omega1
    Lege z.B. eine Property in der Klasse an, die genau diesen Zweck erfüllt

    Nicht eine Klasse anlegen, sondern in der Klasse ein Feld oder eine Property anlegen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Kompromiß :whistling:

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' Globale Variable, dient als eigentlicher Speicherort der Property.
    3. Dim _FrobnicationEnabled As Boolean = False ' "False" als Standardwert.
    4. ' Deklaration der Property als Boolean ("True", oder "False")
    5. Private Property FrobnicationEnabled As Boolean
    6. ' Wenn die Property abgefragt wird, wird mit "Get", der aktuelle Wert aus der Variable geholt und ausgegeben.
    7. Get
    8. Return _FrobnicationEnabled
    9. End Get
    10. ' Wenn die Property gesetzt wird, ...
    11. Set(value As Boolean)
    12. ' ... wird sie in die Variable geschrieben.
    13. _FrobnicationEnabled = value
    14. ' Was jetzt noch kommt, gehört nicht zur Standardprozedur, einer Property.
    15. ' Jetzt wird der Eingabewert, abgefragt und entsprechend etwas ausgeführt.
    16. ' "Select Case" bietet sich bei einem "Boolean" förmlich an, daher kein "If".
    17. Select Case value
    18. Case False
    19. Label1.ForeColor = SystemColors.ControlText ' Standardwert.
    20. Case True
    21. Label1.ForeColor = ColorFromHex("#ff0000")
    22. End Select
    23. End Set
    24. End Property
    25. ' Ein bißchen Konvertiererrei.
    26. Private Function ColorFromHex(ByVal hexStr As String) As Color
    27. Return DirectCast(TypeDescriptor.GetConverter(GetType(Color)).ConvertFromString(hexStr), Color)
    28. End Function
    29. ' ToggleButton.
    30. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    31. Select Case FrobnicationEnabled
    32. Case True
    33. FrobnicationEnabled = False
    34. Case False
    35. FrobnicationEnabled = True
    36. End Select
    37. End Sub
    38. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Pasta“ ()

    Omega1 schrieb:


    If Label1.Foreground = Color.FromArgb(1, 1, 1, 1) Then

    so langsam verzweifel ich an dieser Lappalie

    Das Problem ist wie @Niko Ortner in Post #3 schon sagte: Label.Foreground gibt ein Objekt vom Typ Brush zurück, keine Color. Daher lassen sich diese beiden Typen auch nicht mit dem = Operator vergleichen.

    Brush ist dabei allerdings nur eine Basisklasse. Das ermöglicht es dir unter Anderem, auch solche Dinge wie Verläufe als "Farbe" für das Label einzustellen. Wenn du weißt, dass dein Label nur eine Farbe hat, kannst du folgendes versuchen (ungetestet, ich bin aus VB ein bisschen raus).

    VB.NET-Quellcode

    1. Dim brush As SolidColorBrush
    2. brush = CType(Label1.Foreground, SolidColorBrush) ' Versuche die Brush Eigenschaft in einen SolidColorBrush zu casten
    3. If (brush?.Color = Color.FromArgb(1, 1, 1, 1)) Then
    4. ' do stuff


    Das ? im Code ist übrigens Absicht. Es bezweckt, dass die If Abfrage als false ausgewertet wird, wenn die .Foreground Eigenschaft keinen SolidColorBrush zurück gibt. Anderenfalls würdest du eine Ausnahme bekommen.
    @Solaris
    CType

    Du hast wahrscheinlich TryCast gemeint (das Äquivalent von as in C#).
    CType(x, T) ist ähnlich wie (T)x in C#.
    Grob passiert folgendes: Wenn es einen expliziten oder impliziten Konvertierungsoperator vom Typ von x nach T gibt, wird dieser aufgerufen. Wenn DirectCast(x, T) funktioniert, wird das verwendet.

    Trotzdem sollte der Datenfluss so aussehen:

    Quellcode

    1. Klick
    2. └───> Property
    3. ├───> Label
    4. └───> Berechnungen

    Und nicht so:

    Quellcode

    1. Klick
    2. └───> Label
    3. └───> Berechnungen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()