Wie eine DependencyProperty als Hintergrund von einem Style setzten?

  • WPF

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Wie eine DependencyProperty als Hintergrund von einem Style setzten?

    Hallo,
    ich bin gerade dabei, mir ein TabControl-Style zu schreiben. Da ich die Hover/MouseDown/Normale Farbe selbst einstellen will, habe ich eine Klasse erstellt, welche von TabItem erbt und drei neue Eigenschaften implementiert (ich hoffe, dass ich das richtig gemacht habe....). Die Klasse sieht so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Partial Public Class MetroTabItem
    2. Inherits TabItem
    3. Shared BackBrushProperty As DependencyProperty
    4. Shared DownBrushProperty As DependencyProperty
    5. Shared HoverBrushProperty As DependencyProperty
    6. Shared Sub New()
    7. BackBrushProperty = DependencyProperty.Register("BackBrush", GetType(SolidColorBrush), GetType(MetroTabItem))
    8. DownBrushProperty = DependencyProperty.Register("DownBrush", GetType(SolidColorBrush), GetType(MetroTabItem))
    9. HoverBrushProperty = DependencyProperty.Register("HoverBrush", GetType(SolidColorBrush), GetType(MetroTabItem))
    10. End Sub
    11. Public Property BackBrush As SolidColorBrush
    12. Get
    13. Return DirectCast(MyBase.GetValue(BackBrushProperty), SolidColorBrush)
    14. End Get
    15. Set(value As SolidColorBrush)
    16. MyBase.SetValue(BackBrushProperty, value)
    17. End Set
    18. End Property
    19. Public Property DownBrush As SolidColorBrush
    20. Get
    21. Return DirectCast(MyBase.GetValue(DownBrushProperty), SolidColorBrush)
    22. End Get
    23. Set(value As SolidColorBrush)
    24. MyBase.SetValue(DownBrushProperty, value)
    25. End Set
    26. End Property
    27. Public Property HoverBrush As SolidColorBrush
    28. Get
    29. Return DirectCast(MyBase.GetValue(HoverBrushProperty), SolidColorBrush)
    30. End Get
    31. Set(value As SolidColorBrush)
    32. MyBase.SetValue(HoverBrushProperty, value)
    33. End Set
    34. End Property
    35. End Class


    Jetzt möchte ich einfach auf zB. die Eigenschaft BackBrush zugreifen und dies als Hintergrund setzten, also etwas so:

    XML-Quellcode

    1. <Style TargetType="{x:Type my:MetroTabItem}">
    2. <Setter Property="Template" >
    3. <Setter.Value >
    4. <ControlTemplate TargetType="my:MetroTabItem">
    5. <Grid Name="BG" Background="BackBrush"> <!-- Das geht so natürlich nicht -->
    6. ...
    7. </Grid>
    8. </ControlTemplate>
    9. </Setter.Value>
    10. </Setter>
    11. </Style>


    Wie mache ich das am besten? Danke für eure Antworten :)
    Mfg
    Vincent

    Perfekt, das funktioniert, danke :)

    Kleine Anmerkung: Oben in dem Codeauschnitt sind meine DependencyProperties falsch deklariert, jedenfalls müssen (mussten sie bei mir) so sein:

    VB.NET-Quellcode

    1. Public Shared ReadOnly BackBrushProperty As DependencyProperty
    2. ...
    3. 'Und dann:
    4. BackBrushProperty = DependencyProperty.Register("BackBrush", GetType(SolidColorBrush), GetType(MetroTabItem), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender))

    damit es funktioniert.
    Mfg
    Vincent

    Nur als Tipp: Ich bin davon überzeugt, dass du kein neues Control schreiben musst. Es reicht vollkommen ein Template zu schreiben. In WPF schreibt man in über 90% der Fälle kein neues Control.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Artentus schrieb:

    Zur Laufzeit?

    Jap.

    @thefiloe
    Okay, also Dynamische Ressourcen sind, so wie ich das verstanden habe, fast so wie statische Ressourcen mit dem Unterschied, dass sie sie bei einer Veränderung aktualisieren. Wie kann ich Ressourcen zur Laufzeit direkt verändern/ansprechen?
    Mfg
    Vincent

    Ich habe langsam das Gefühl, wir reden aneinander vorbei...
    Das ganze soll ein einfaches TabControl werden. Die Farbe soll aus einem typisierten DataSet kommen. Außerdem soll man in den Einstellungen die Farbe verändern können. Da wäre es halt gut, wenn man die Veränderung direkt sieht und nicht erst nach einem Neustart. Für beides müsste ich dann auf den Brush zugreifen...
    Mfg
    Vincent

    Ach so, ja dann solltest du das wohl besser an Eigenschaften in deinem ViewModel binden.

    Außerdem soll man in den Einstellungen die Farbe verändern können.
    Das halte ich allerdings trotzdem für unnötig. Was bringt es dir, diese Farben zur Laufzeit ändern zu können? Hast du schon mal ein Programm gesehen, das sowas macht? Man sollte einfach einen möglichst dezenten und neutralen Stil verwenden, für viel Farbe ist da sowieso kein Platz.
    Wenn du übrigens Controls schreibst, so ist es in der Praxis üblich, dass man Ressourcen definiert und die Keys dieser Ressourcen dem Benutzer zur Verfügung stellt. Wenn der Benutzer nun einen Style oder ein Template erstellt, so kann er Ressourcen mit dem gleichen Key definieren, welche dann automatisch die alten Ressourcen ersetzen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Gar nicht. Du musst ihm die Deklarationen in einer Liste geben. Wenn du dir das an einem Beispiel anschaust: msdn.microsoft.com/en-us/library/ms754242.aspx
    Unten sind die verschiedenen Ressourcen aufgelistet.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.