VisualStatemanager Prioritäten falsch

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    VisualStatemanager Prioritäten falsch

    Guten Abend.

    Ich war gerade dabei mir einen Style für alle Buttons zu erstellen, der das Windows 8-Desktoptheme nachahmt, da ich mit dem Standardtheme von WPF unter Windows 8 gerade für die Buttons extrem unzufrieden bin.
    Erscheint auch gar nicht schwer, schnell Screenshot machen, mit Photoshop die Farben raussuchen und einprogrammieren. Ich bin damit auch eigentlich fertig, mein Code ist dieser:
    Spoiler anzeigen

    XML-Quellcode

    1. <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
    2. <Style.Setters>
    3. <Setter Property="Template">
    4. <Setter.Value>
    5. <ControlTemplate TargetType="{x:Type Button}">
    6. <Border x:Name="Border" BorderBrush="#FFACACAC" BorderThickness="1">
    7. <Border.Background>
    8. <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
    9. <GradientStop x:Name="Stop1" Offset="0" Color="#FFF0F0F0"/>
    10. <GradientStop x:Name="Stop2" Offset="1" Color="#FFE5E5E5"/>
    11. </LinearGradientBrush>
    12. </Border.Background>
    13. <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
    14. <VisualStateManager.VisualStateGroups>
    15. <VisualStateGroup Name="CommonStates">
    16. <VisualState Name="Normal"/>
    17. <VisualState Name="Focused">
    18. <Storyboard>
    19. <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" To="#FF3399FF" Duration="0:0:0:0.3"/>
    20. </Storyboard>
    21. </VisualState>
    22. <VisualState Name="MouseOver">
    23. <Storyboard>
    24. <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" To="#FF7EB4EA" Duration="0:0:0:0.3"/>
    25. <ColorAnimation Storyboard.TargetName="Stop1" Storyboard.TargetProperty="Color" To="#FFECF4FC" Duration="0:0:0:0.3"/>
    26. <ColorAnimation Storyboard.TargetName="Stop2" Storyboard.TargetProperty="Color" To="#FFDCECFC" Duration="0:0:0:0.3"/>
    27. </Storyboard>
    28. </VisualState>
    29. <VisualState Name="Pressed">
    30. <Storyboard>
    31. <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" To="#FF569DE5" Duration="0:0:0:0.3"/>
    32. <ColorAnimation Storyboard.TargetName="Stop1" Storyboard.TargetProperty="Color" To="#FFDAECFC" Duration="0:0:0:0.3"/>
    33. <ColorAnimation Storyboard.TargetName="Stop2" Storyboard.TargetProperty="Color" To="#FFC4E0FC" Duration="0:0:0:0.3"/>
    34. </Storyboard>
    35. </VisualState>
    36. </VisualStateGroup>
    37. </VisualStateManager.VisualStateGroups>
    38. </Border>
    39. </ControlTemplate>
    40. </Setter.Value>
    41. </Setter>
    42. </Style.Setters>
    43. </Style>

    Jetzt gibt es damit aber leider ein äußerst lästiges Problem mit der Priorität, in der die Stile vom VisualStyleManager ausgewertet werden. Anstatt dass wie unter Windows die Effekte für MouseOver und Pressed auch über fokussierte Buttons gelegt werden, werden sie hier von eben diesem blockiert. Besitzt ein Button einmal den Fokus werden MouseOver und Pressed gar nicht mehr abgespielt, das hat zur Folge, dass man Pressed überhaupt nicht sieht, denn in dem Moment wurde der Fokus bereits gesetzt.
    Ich hab ein wenig gesucht aber so überhaupt nichts in die Richtung finden können und Prioritäten scheint man nirgends setzten zu können? Jemand ne Idee?
    Ich probier damit grad herum, aber mir fehlt glaub paar Infos / KnowHow.

    Diese VisualStates scheinen sich ja auf iwas zu beziehen - wo issn das definiert/dokumentiert?

    Bei meine Versuche hab ich mal nur den "Pressed"-VisualState drin gelassen, und fand, der stellt sich ühaupt nicht mehr zurück - eiglich ist doch nur pressed, solange die Mouse down ist - so ists jdfs. beinem normalen Button.

    Edit: hab nu auch das Msdn-Codesample gefunden - beziehst du dich darauf? msdn.microsoft.com/query/dev11…workMoniker-.NETFramework
    Du musst den Normal-State drin lassen, sonst stellt sichs glaub ich nicht wieder zurück.
    Die VisualStates sind eine dieser WPF-Hexereien. Man kann so das Aussehen eines Steuerelements anhand seines aktuellen Zustandes definieren. Der VisualStateManager sorgt dann dafür, dass immer die passenden Storyboards abgespielt werden und auch rückwärts abgespielt werden um den Standard wiederherzustellen (frag mich nicht, wie das funktioniert).
    Besser gesagt wäre allerdings, der VisualStateManager sollte immer das passende StoryBoard abspielen, aber hier tut ers nicht.
    ich hab den Normal-State drinne.
    Ich hab denselben VisualState mal "MouseOver" genannt, und funzt, und "Pressed" und funzt net.

    also nur ein State pro Testlauf

    Hier ein ButtonStyle von MS, der richtig funzt: msdn.microsoft.com/de-de/library/ms753328(v=vs.110).aspx

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

    Weiß nicht woran das liegt. Schon mal einfach den Style so wie er hier steht 1zu1 in die Ressourcen kopiert? Weil bei mir gehts und das ist ja auch nicht das Problem.
    Der Style von MSDN funzt, weil Focused nicht mit drin ist. Füge ich das hinzu passiert das gleiche wie bei meinem Style. ;)
    Klar, aber da weiß ich ühaupt nicht, wie das erwünschte Verhalten eiglich aussähe.

    Reagieren tut er nur auf MouseOver, nicht aber auf Pressed.

    etwas vernünftiger siehts aus, wenn man den Focused auskommentiert.
    Der gehört übrigens in eine annere VisualStateGroup, so las ich do auf msdn - aber helfen tut das auch nix.