Benutzer mit den meisten Antworten
Problem mit ButtonTemplate in Wpf Anwendung

Frage
-
Hallo,
ich bin momentan eine WPF-Anwendung in C# (.Net 4.5) am schreiben. Letztens habe ich versucht, das Aussehen eines Buttons durch ein Template anzupassen.
Mein Xaml-Code:
<Window x:Class="Buttontest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <Style x:Key="MyFocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Control}"> <Grid Margin="3 2"> <Rectangle Name="r1" StrokeThickness="1" Stroke="Black" StrokeDashArray="2 2"/> <Border Name="border" Width="{TemplateBinding ActualWidth}" Height="{TemplateBinding ActualHeight}" CornerRadius="2" BorderThickness="1" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="playButton" TargetType="{x:Type Button}"> <Setter Property="OverridesDefaultStyle" Value="True"/> <Setter Property="Margin" Value="2"/> <Setter Property="FontFamily" Value="Verdana"/> <Setter Property="FontSize" Value="11px"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisual}" /> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" > <GradientStop Color="#FFFFD190" Offset="0.2"/> <GradientStop Color="Orange" Offset="0.85"/> <GradientStop Color="#FFFFD190" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid> <Button Height="50" Width="50" Style="{DynamicResource playButton}">Play</Button> </Grid> </Window>
Der Button wird ,seitdem ich den Style auf "{DynamicResource playButton}" festgelegt habe, nicht mehr angezeigt. Ich habe lange nach dem Fehler in dem Style und Template gesucht, aber bis jetzt keinen gefunden. Ich vermute, dass dem Style/Template irgendetwas fehlt. Durch<Setter Property="OverridesDefaultStyle" Value="True"/>
muss ich ja viele Dinge implementieren, da der DefaultStyle überschrieben wird.
Fällt jemandem mein Fehler auf?
Antworten
-
Das Problem ist, wenn du "OverrideDefaultStyle" auf True setzt, dass er auch die Eigenschaft "Template" überschreibt. Diese ist dafür Zuständig, wie der Button angezeigt werden soll. Also Probiere mal sowas wie
<Style x:Key="playButton" TargetType="{x:Type Button}"> <Setter Property="OverridesDefaultStyle" Value="True"/> <Setter Property="Margin" Value="2"/> <Setter Property="FontFamily" Value="Verdana"/> <Setter Property="FontSize" Value="11px"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisual}" /> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" > <GradientStop Color="#FFFFD190" Offset="0.2"/> <GradientStop Color="Orange" Offset="0.85"/> <GradientStop Color="#FFFFD190" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <!-- Hier das Setzen des Templates --> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}"> <Grid Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> <ContentPresenter /> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
Falls du auch vor hast, dass sich das Design verändert, wenn du mit der Maus drüber fährst ("IsMouseOver") oder wenn und drauf klickst ("IsPressed"), dann musst du wohl mit Style-Triggern (Style.Triggers) arbeiten:
<Style [...]> [...] <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="Red" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" Value="Black" /> </Trigger> </Style.Triggers> </Style>
Ich hoffe ich konnte dir damit helfen
Alle Antworten
-
Hallo User95,
Mehr Information über Ihre Frage, können Sie hier finden
Programmatically changing button icon in WPF
Gruß
Aleksander
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
-
Danke für die Antwort!
Ich wollte aber eigentlich den Defaultstyle überschreiben, weil sich der Button sonst blau einfärbt, wenn ich mit der Maus darüber fahre. Der Button wird zwar ohne den Setter
<Setter Property="OverridesDefaultStyle" Value="True"/>
dargestellt, aber irgendwie sind da vom Design her noch sehr viele Windows spezifische Elemente enthalten.
Ich wollte herausfinden, wie ich einen vollständigen, eigenen Style für einen WPF-Button erstellen kann. Wenn mein Style vollständig wäre, so dürfte es eigentlich kein Problem sein, wenn ich den "Defaultstyle" überschreibe.
MfG
Josef
-
Danke für den Tipp!
Meine Frage habe ich wohl nicht richtig ausgedrückt. Sorry! Ich habe den Tipp von Claudius Hauser ausprobiert; in der Tat wird der Button angezeigt, wenn ich den Setter
<Setter Property="OverridesDefaultStyle" Value="True"/>
weglasse. Meine Frage dazu wäre, was meinem Style fehlt, dass der Button auch mit dem oben genannten Setter (Value="true") funktioniert.
MfG
Josef
-
Das Problem ist, wenn du "OverrideDefaultStyle" auf True setzt, dass er auch die Eigenschaft "Template" überschreibt. Diese ist dafür Zuständig, wie der Button angezeigt werden soll. Also Probiere mal sowas wie
<Style x:Key="playButton" TargetType="{x:Type Button}"> <Setter Property="OverridesDefaultStyle" Value="True"/> <Setter Property="Margin" Value="2"/> <Setter Property="FontFamily" Value="Verdana"/> <Setter Property="FontSize" Value="11px"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisual}" /> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" > <GradientStop Color="#FFFFD190" Offset="0.2"/> <GradientStop Color="Orange" Offset="0.85"/> <GradientStop Color="#FFFFD190" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <!-- Hier das Setzen des Templates --> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}"> <Grid Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> <ContentPresenter /> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
Falls du auch vor hast, dass sich das Design verändert, wenn du mit der Maus drüber fährst ("IsMouseOver") oder wenn und drauf klickst ("IsPressed"), dann musst du wohl mit Style-Triggern (Style.Triggers) arbeiten:
<Style [...]> [...] <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="Red" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" Value="Black" /> </Trigger> </Style.Triggers> </Style>
Ich hoffe ich konnte dir damit helfen