none
Problem mit ButtonTemplate in Wpf Anwendung RRS feed

  • 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?


    Samstag, 1. November 2014 10:44

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


    • Bearbeitet MaSch0212 Montag, 3. November 2014 21:55
    • Als Antwort markiert User95 Dienstag, 4. November 2014 19:42
    Montag, 3. November 2014 21:48

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.

    Montag, 3. November 2014 08:10
  • Lass doch einfach die Zeile

    <Setter Property="OverridesDefaultStyle" Value="True"/>

    einfach weg oder setz es auf False.

    Dann erscheint der Button so, wie er im Style beschrieben wird.

    Oder versteh ich jetzt deinen Fehler nicht ?

    Gruß Claudius

    Montag, 3. November 2014 14:28
  • 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

    Montag, 3. November 2014 18:39
  • 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

    Montag, 3. November 2014 18:44
  • 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


    • Bearbeitet MaSch0212 Montag, 3. November 2014 21:55
    • Als Antwort markiert User95 Dienstag, 4. November 2014 19:42
    Montag, 3. November 2014 21:48
  • Vielen Dank! Das löst mein Problem. Ich wusste nicht, dass bei
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    auch das Template überschrieben wird, was zur Darstellung erforderlich ist.
    Dienstag, 4. November 2014 19:44