上面这个解决了问题,但是它改变了整个模板,有没有更优雅的解决方案,例如这样的:
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="StoryBoard" Value="Disable" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="StoryBoard" Value="Disable" />
</Trigger>
</Style.Triggers>
不是故事板对
MouseOver
和 Pressed
事件进行动画处理,而是按钮的 BorderBrush
通过 ControlTemplate
触发器进行更新。如果您想摆脱这些触发器,不幸的是您必须覆盖模板以从默认模板中删除这些触发器。
默认模板可以在这里找到。您可以在那里看到负责更新边框画笔的触发器。
只需从默认模板中删除该触发器即可。如果您希望将该样式应用于应用程序中的所有按钮,请将样式放入应用程序资源中。
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Border"
BorderThickness="1"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}">
<ContentPresenter Margin="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RecognizesAccessKey="True"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
除此之外,如果您想让按钮具有工具栏按钮的外观和感觉,您可以通过简单地应用这样的工具栏按钮样式来实现 -
<Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"/>
您还可以使用 PreviewMouseLeftButtonDown 的处理程序代替 ButtonClick
功能与命令相同 e.Handled = true;确保动画不会启动
private void button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//some your code
e.Handled = true;
}