Maybe I'm wrong here, but it seems like you have radio button functionality baked into button template. When you click a button it stays "clicked" (or checked) and when you click another button it "releases" the click from first button.
I'd change the target type of the template to RadioButton
and the trigger to:
<Trigger Property="IsChecked" Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="ButtonCheckedStoryboardBegin"
Storyboard="{StaticResource MouseDownTimeLine}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<StopStoryboard BeginStoryboardName="ButtonCheckedStoryboardBegin"/>
</Trigger.ExitActions>
</Trigger>
Using StopStoryboard
because duratios in MouseExitTimeLine are zero. If you actually need duration for exit animation, use:
<Trigger Property="IsChecked" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MouseDownTimeLine}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource MouseExitTimeLine}"/>
</Trigger.ExitActions>
</Trigger>
[second option can be used as is - with zero duration, but it's less elegant, IMO]
Also, the animation for "Hover" in MouseExitTimeLine is redundant and can be removed since MouseDownTimeLine is not setting anything on "Hover".
Now, on each instance of RadioButton
in layout, add GroupName="<Some string here>"
. Only one radio button in a group can be checked at any given point in time.