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
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 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:
XML-Quellcode
- <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
- <Style.Setters>
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="{x:Type Button}">
- <Border x:Name="Border" BorderBrush="#FFACACAC" BorderThickness="1">
- <Border.Background>
- <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
- <GradientStop x:Name="Stop1" Offset="0" Color="#FFF0F0F0"/>
- <GradientStop x:Name="Stop2" Offset="1" Color="#FFE5E5E5"/>
- </LinearGradientBrush>
- </Border.Background>
- <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
- <VisualStateManager.VisualStateGroups>
- <VisualStateGroup Name="CommonStates">
- <VisualState Name="Normal"/>
- <VisualState Name="Focused">
- <Storyboard>
- <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" To="#FF3399FF" Duration="0:0:0:0.3"/>
- </Storyboard>
- </VisualState>
- <VisualState Name="MouseOver">
- <Storyboard>
- <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" To="#FF7EB4EA" Duration="0:0:0:0.3"/>
- <ColorAnimation Storyboard.TargetName="Stop1" Storyboard.TargetProperty="Color" To="#FFECF4FC" Duration="0:0:0:0.3"/>
- <ColorAnimation Storyboard.TargetName="Stop2" Storyboard.TargetProperty="Color" To="#FFDCECFC" Duration="0:0:0:0.3"/>
- </Storyboard>
- </VisualState>
- <VisualState Name="Pressed">
- <Storyboard>
- <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" To="#FF569DE5" Duration="0:0:0:0.3"/>
- <ColorAnimation Storyboard.TargetName="Stop1" Storyboard.TargetProperty="Color" To="#FFDAECFC" Duration="0:0:0:0.3"/>
- <ColorAnimation Storyboard.TargetName="Stop2" Storyboard.TargetProperty="Color" To="#FFC4E0FC" Duration="0:0:0:0.3"/>
- </Storyboard>
- </VisualState>
- </VisualStateGroup>
- </VisualStateManager.VisualStateGroups>
- </Border>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style.Setters>
- </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?