我想在窗口级别定义我的 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>
所以,有解决方案,但如果有人能更好地解释为什么,我会很感激。