Invalidate in einer Structure verwenden? GDI+

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ISD.

    Invalidate in einer Structure verwenden? GDI+

    Hallo.

    Ich hab ein Problem mit dem aktualisieren der Eigenschaften.
    Wenn ich eine Farbe im Eigenschaften-Fenster von Visual Studio ändere und dann auf ein anderes Steuerelement klicke, wird diese Farbe dann übernommen.
    Ich möchte aber, dass diese Farbe sofort aktualisiert wird.
    Nur kann ich eben in dieser Structure, die die Farbeigenschaften enthalten, kein Invalidate() durchführen.
    @Gather hat mir bereits etwas geholfen und mir empfohlen ein Event zu erstellen, jedoch hab ich davon keine Ahnung und weiß nicht wie ich diese dann in der Structure verwenden kann.

    VB.NET-Quellcode

    1. #Region "Color Properties"
    2. <TypeConverter(GetType(ExpandableObjectConverter))>
    3. Public Property Colors As New ColorProperties
    4. <TypeConverter(GetType(ColorProperties))>
    5. Public Structure ColorProperties
    6. Public Property HoverCloseBackgroundColor As Color
    7. Get
    8. Return _HoverCloseBackgroundColor
    9. End Get
    10. Set(value As Color)
    11. _HoverCloseBackgroundColor = value
    12. End Set
    13. End Property
    14. Public Property HoverMaximizeBackgroundColor As Color
    15. Get
    16. Return _HoverMaximizeBackgroundColor
    17. End Get
    18. Set(value As Color)
    19. _HoverMaximizeBackgroundColor = value
    20. End Set
    21. End Property
    22. Public Property HoverMinimizeBackgroundColor As Color
    23. Get
    24. Return _HoverMinimizeBackgroundColor
    25. End Get
    26. Set(value As Color)
    27. _HoverMinimizeBackgroundColor = value
    28. End Set
    29. End Property
    30. Public Property CloseColor As Color
    31. Get
    32. Return _CloseColor
    33. End Get
    34. Set(value As Color)
    35. _CloseColor = value
    36. End Set
    37. End Property
    38. Public Property MaximizeColor As Color
    39. Get
    40. Return _MaximizeColor
    41. End Get
    42. Set(value As Color)
    43. _MaximizeColor = value
    44. End Set
    45. End Property
    46. Public Property MinimizeColor As Color
    47. Get
    48. Return _MinimizeColor
    49. End Get
    50. Set(value As Color)
    51. _MinimizeColor = value
    52. End Set
    53. End Property
    54. Public Property HoverCloseColor As Color
    55. Get
    56. Return _HoverCloseColor
    57. End Get
    58. Set(value As Color)
    59. _HoverCloseColor = value
    60. End Set
    61. End Property
    62. Public Property HoverMaximizeColor As Color
    63. Get
    64. Return _HoverMaximizeColor
    65. End Get
    66. Set(value As Color)
    67. _HoverMaximizeColor = value
    68. End Set
    69. End Property
    70. Public Property HoverMinimizeColor As Color
    71. Get
    72. Return _HoverMinimizeColor
    73. End Get
    74. Set(value As Color)
    75. _HoverMinimizeColor = value
    76. End Set
    77. End Property
    78. Public Property BackgroundColor1 As Color
    79. Get
    80. Return _BackgroundColor1
    81. End Get
    82. Set(value As Color)
    83. _BackgroundColor1 = value
    84. End Set
    85. End Property
    86. Public Property BackgroundColor2 As Color
    87. Get
    88. Return _BackgroundColor2
    89. End Get
    90. Set(value As Color)
    91. _BackgroundColor2 = value
    92. End Set
    93. End Property
    94. Public Property HeaderColor As Color
    95. Get
    96. Return _HeaderColor
    97. End Get
    98. Set(value As Color)
    99. _HeaderColor = value
    100. End Set
    101. End Property
    102. Public Property BottomBarColor As Color
    103. Get
    104. Return _BottomBarColor
    105. End Get
    106. Set(value As Color)
    107. _BottomBarColor = value
    108. End Set
    109. End Property
    110. Public Property BorderColor As Color
    111. Get
    112. Return _BorderColor
    113. End Get
    114. Set(value As Color)
    115. _BorderColor = value
    116. End Set
    117. End Property
    118. Public Property ShinyColor As Color
    119. Get
    120. Return _ShinyColor
    121. End Get
    122. Set(value As Color)
    123. _ShinyColor = value
    124. End Set
    125. End Property
    126. Public Property TextColor As Color
    127. Get
    128. Return _TextColor
    129. End Get
    130. Set(value As Color)
    131. _TextColor = value
    132. End Set
    133. End Property
    134. End Structure
    135. Public Class ColorsConverter : Inherits TypeConverter
    136. Public Overrides Function GetProperties(ByVal Context As ITypeDescriptorContext, ByVal Value As Object, ByVal Attributes() As Attribute) As PropertyDescriptorCollection
    137. Return Context.PropertyDescriptor.GetChildProperties(Value, Attributes)
    138. End Function
    139. Public Overrides Function GetPropertiesSupported(ByVal Context As ITypeDescriptorContext) As Boolean
    140. Return True
    141. End Function
    142. Public Overrides Function CanConvertTo(ByVal Context As ITypeDescriptorContext, ByVal DestinationType As Type) As Boolean
    143. Return GetType(Color).IsAssignableFrom(DestinationType)
    144. End Function
    145. Public Overrides Function IsValid(ByVal Context As ITypeDescriptorContext, ByVal Value As Object) As Boolean
    146. Return Value IsNot Nothing AndAlso CanConvertTo(Value.GetType())
    147. End Function
    148. Public Overrides Function ConvertTo(ByVal Context As ITypeDescriptorContext, ByVal Culture As Globalization.CultureInfo, ByVal Value As Object, ByVal DestinationType As Type) As Object
    149. If GetType(Color).IsAssignableFrom(DestinationType) Then
    150. Dim Colors As ColorProperties = Value
    151. Return String.Format("CloseColor = {0}, HoverCloseColor = {1}, HoverCloseBackgroundColor = {2}, " +
    152. "MaximizeColor = {3}, HoverMaximizeColor = {4}, HoverMaximizeBackgroundColor = {5}, " +
    153. "MinimizeColor = {6}, HoverMinimizeColor = {7}, HoverMinimizeBackgroundColor = {8}, " +
    154. "BackgroundColor1 = {9}, BackgroundColor2 = {10}, HeaderColor = {11}, BottomBarColor = {12}, " +
    155. "ShinyColor = {13}, BorderColor = {14}, TextColor = {15}",
    156. Colors.CloseColor, Colors.HoverCloseColor, Colors.HoverCloseBackgroundColor,
    157. Colors.MaximizeColor, Colors.HoverMaximizeColor, Colors.HoverMaximizeBackgroundColor,
    158. Colors.MinimizeColor, Colors.HoverMinimizeColor, Colors.HoverMinimizeBackgroundColor,
    159. Colors.BackgroundColor1, Colors.BackgroundColor2,
    160. Colors.HeaderColor, Colors.BottomBarColor, Colors.ShinyColor, Colors.BorderColor, Colors.TextColor)
    161. Else
    162. Throw New ArgumentException("Can't convert to the specified type.")
    163. End If
    164. End Function
    165. End Class
    166. #End Region
    167. #Region "Colors"
    168. Private Shared _CloseColor As Color = Color.FromArgb(75, 75, 75)
    169. Private Shared _MaximizeColor As Color = Color.FromArgb(75, 75, 75)
    170. Private Shared _MinimizeColor As Color = Color.FromArgb(75, 75, 75)
    171. Private Shared _HoverCloseColor As Color = White
    172. Private Shared _HoverMaximizeColor As Color = White
    173. Private Shared _HoverMinimizeColor As Color = White
    174. Private Shared _HoverCloseBackgroundColor As Color = Color.FromArgb(210, 75, 75)
    175. Private Shared _HoverMaximizeBackgroundColor As Color = Gray
    176. Private Shared _HoverMinimizeBackgroundColor As Color = Gray
    177. Private Shared _BackgroundColor1 As Color = Color.FromArgb(41, 41, 41)
    178. Private Shared _BackgroundColor2 As Color = Color.FromArgb(255, 0, 0, 0)
    179. Private Shared _HeaderColor As Color = Dark
    180. Private Shared _BottomBarColor As Color = Dark
    181. Private Shared _ShinyColor As Color = White
    182. Private Shared _BorderColor As Color = White
    183. Private Shared _TextColor As Color = White
    184. #End Region


    Verbesserungsvorschläge sind gerne gesehen.
    Ich würde mich über Hilfe ebenfalls freuen.


    Mit freundlichen Grüßen
    ISD

    ISD schrieb:

    Invalidate()
    Was in dieser Struktur soll invalidisiert werden?
    Invalidate() wird üblicherweise verwendet, um für Zeichenflächen (z.B. PictureBox) das Paint-Evant auszulösen.
    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!
    Stell dir mal einen Button vor, den du selber mit GDI+ gezeichnet hast.
    Anschließend soll zum Beispiel beim verändern der Textfarbe dies auch sofort beim Button sichtbar sein,
    ohne das man davor ein anderes Steuerelement anklicken muss, bis die Änderungen vorgenommen werden.

    Dies ist mein aktuelles Problem und ich finde leider überhaupt keine Lösung dafür.
    Es gibt ein Attribut namens RefreshProperties - das sorgt dafür, dass das PropertyGrid bei einer Änderung der Property aktualisiert wird.

    @RodFromGermany
    Es scheint nicht um die Aktualisierung des Controls sondern um die des PropertyGrids vom VisualStudio-Designer zu gehen, wenn ich das recht verstanden habe.

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

    @ISD Wo ist das Problem?
    Wenn die Textfarbe geändert wird, kann doch in der entsprechenden Property die Zeichenfläche invalidisiert werden.
    Das die Property haltende Objekt muss nur eine Instanz der Zeichenfläche haben.
    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!

    nafets schrieb:

    Es gibt ein Attribut namens RefreshProperties - das sorgt dafür, dass das PropertyGrid bei einer Änderung der Property aktualisiert wird.

    @RodFromGermany
    Es scheint nicht um die Aktualisierung des Controls sondern um die des PropertyGrids vom VisualStudio-Designer zu gehen, wenn ich das recht verstanden habe.

    Es handelt sich schon um das Steuerelement.
    Es soll ja die geänderte Farbe übernehmen.
    Achso, dann hatte Rod wohl doch recht. Dann implementiere einfach das ​INotifyPropertyChanged-Interface und das dazugehörige Event, welches du dann in deinem Control handelst.

    ISD schrieb:

    Steuerelement

    RodFromGermany schrieb:

    Wo ist das Problem?
    Siehe oben, Post bitte nicht ignorieren.
    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!
    Hab ich nicht, keine Sorge.
    Ich hab es nur nochmal erwähnt, damit @nafets es weiß.

    Ich probiere das ganze jetzt aus, ich danke euch schon mal für eure Hilfe!

    EDIT:
    Hab das jetzt so gemacht:

    VB.NET-Quellcode

    1. <TypeConverter(GetType(ExpandableObjectConverter))>
    2. Public Property Colors As New ColorProperties
    3. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    4. Public Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing)
    5. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    6. End Sub
    7. <TypeConverter(GetType(ColorProperties))>
    8. Public Structure ColorProperties
    9. <NotifyParentProperty(True)>
    10. Public Property HoverCloseBackgroundColor As Color
    11. Get
    12. Return _HoverCloseBackgroundColor
    13. End Get
    14. Set(value As Color)
    15. _HoverCloseBackgroundColor = value
    16. [color=#FF0000]NotifyPropertyChanged()[/color]
    17. End Set
    18. End Property


    Allerdings kommt folgendes bei NotifyPropertyChanged():
    Fehler BC30469: Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.

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