1

我想在窗口级别定义我的 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>

我想要做的是定义按钮的一些样式属性,如宽度或颜色,并设置一个 VisualState 来稳定按钮在 Pressed、MouseOver 等上的行为。

但是该代码不起作用,因为一旦定义了“模板”属性,所有其他属性(宽度、边距等)都被遗忘了,让它工作的正确方法是什么?我应该在模板的“网格”属性中定义所有按钮属性吗?

谢谢你。

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

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

无论如何,问题是两次:

首先:“MainButtonStyle”设置的所有属性都可以正常工作,除了“Background”,它似乎被 ControlTemplate 上的 Grid 覆盖,所以我必须在 Grid 上设置 BackGround 属性,而不是在 Button 上设置它...我不明白为什么会这样。

第二:“StoryBoard.TargetProperty="Background" 不能分配给 Color 对象,我必须指定 "StoryBoard.TargetProperty="BackGround.Color" 才能正确分配 Color 对象。和以前一样,我不明白为什么。如果在其他控件中我可以将 BackGround 属性直接设置为“BackGround =”Red”之类的颜色值,为什么在 StoryBoard 中我必须将其设置为“BackGround.Color="Red"?

好的,现在代码工作:

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

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

4

1 回答 1

0

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

于 2016-05-31T01:08:22.013 回答