我想在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>
所以,有解决方案,但如果有人可以更好地解释为什么,我会很感激。
答案 0 :(得分:0)
在为控件定义样式并且还覆盖默认控件模板时,该按钮不再具有其默认布局。它仅包含您在控件模板中定义的元素。在上面的情况下,按钮只包含一个网格。