如何使用VisualStateManager设置按钮样式

时间:2014-12-18 16:18:27

标签: wpf visualstatemanager wpf-style

我想在Window级别定义我的WPF应用程序的某些按钮的样式。 这是代码:

<Style x:Key="MainButtonStyle" TargetType="Button">
        <Setter Property="Width" Value="120"/>
        <Setter Property="Height" Value="60"/>
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Background" Value="White"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid x:Name="ButtonGrid">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">

                                <VisualStateGroup.Transitions>
                                    <!--Take one half second to transition to the MouseOver state.-->
                                    <VisualTransition To="MouseOver" GeneratedDuration="0:0:0.5" />
                                </VisualStateGroup.Transitions>

                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimation Duration="0" Storyboard.TargetName="ButtonGrid" Storyboard.TargetProperty="Background" To="Cyan"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ColorAnimation Duration="0" Storyboard.TargetName="ButtonGrid" Storyboard.TargetProperty="Background" To="Red"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我想要做的是定义按钮的一些样式属性,如Width或Color,还设置一个VisualState来强制按下Pressed,MouseOver等按钮的行为。

但是那段代码不起作用,因为一旦&#34;模板&#34;属性已定义,所有其他属性(宽度,边距等)都被遗忘,使其工作的正确方法是什么?我应该定义&#34; Grid&#34;中的所有按钮属性。模板的属性?

谢谢。

编辑:解决方案。但我不明白为什么

好的,我有一个解决方案,现在它工作正常,但我仍然不明白为什么WPF会这样做。我是这种语言的新手,很难知道在不同的控制中使用什么属性以及如何实现它......我发现它在很多情况下都是直观的......我希望它只是我是新手。

任何情况下,问题都是两次:

首先:&#34; MainButtonStyle&#34;设置的所有属性除了&#34;背景&#34;之外的工作正常,它似乎被ControlTemplate的网格覆盖,所以我不得不在Grid上设置BackGround属性而不是在Button上设置它......我不# 39;完成了解为什么会这样。

第二:&#34; StoryBoard.TargetProperty =&#34;背景&#34;不能分配给Color对象,我必须指定&#34; StoryBoard.TargetProperty =&#34; BackGround.Color&#34;正确分配Color对象。和以前一样,我不明白为什么。如果在其他控件中我可以将BackGround属性直接设置为Color值,例如&#34; BackGround =&#34; Red&#34;,为什么在StoryBoard中我必须设置它&#34; BackGround.Color =&# 34;红色&#34 ;?

好的,现在代码工作了:

<Style x:Key="MainButtonStyle" TargetType="Button">
        <Setter Property="Width" Value="120"/>
        <Setter Property="Height" Value="60"/>
        <Setter Property="Margin" Value="5"/>            
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid Background="White" x:Name="ButtonGrid">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>                                            
                                        <ColorAnimation Duration="0:0:0.3" Storyboard.TargetName="ButtonGrid" Storyboard.TargetProperty="Background.Color" To="Cyan"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="ButtonGrid" Storyboard.TargetProperty="Background.Color" To="DarkSalmon"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

所以,有解决方案,但如果有人可以更好地解释为什么,我会很感激。

1 个答案:

答案 0 :(得分:0)

在为控件定义样式并且还覆盖默认控件模板时,该按钮不再具有其默认布局。它仅包含您在控件模板中定义的元素。在上面的情况下,按钮只包含一个网格。