动画图像按钮

时间:2011-10-31 13:56:30

标签: wpf xaml animation imagebutton

我需要帮助我使用一段时间的自定义“图像按钮”。它工作得很好,但我无法弄清楚如何使用这三种状态(正常,鼠标悬停,按下)为按钮设置动画:

  1. 正常到MouseOver
  2. MouseOver to Pressed
  3. 我不熟悉XAML,所以我无法弄明白。无论如何这里是我一直在使用的代码:

    <Button Height="40" HorizontalAlignment="Left" IsEnabled="True" IsHitTestVisible="True" Margin="262,219,0,0" Name="home_btn" VerticalAlignment="Top" Width="89">
        <Button.Template>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Image Name="Normal" Source="normal.png" />
                    <Image Name="Hover" Source="hover.png" Visibility="Hidden" />
                    <Image Name="Pressed" Source="pressed.png" Visibility="Hidden" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="ButtonBase.IsPressed" Value="True">
                        <Setter Property="UIElement.Visibility" TargetName="Normal" Value="Hidden" />
                        <Setter Property="UIElement.Visibility" TargetName="Pressed" Value="Visible" />
                    </Trigger>
                    <Trigger Property="UIElement.IsMouseOver" Value="True">
                        <Setter Property="UIElement.Visibility" TargetName="Normal" Value="Hidden" />
                        <Setter Property="UIElement.Visibility" TargetName="Hover" Value="Visible" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Button.Template>
    </Button>
    

    任何答案都表示赞赏。

2 个答案:

答案 0 :(得分:4)

完成动画的另一种方法是使用与Storyboards

组合使用的触发器

以下是一些示例代码(集成在您发布的代码中):

 <Button Height="40" HorizontalAlignment="Left" IsEnabled="True" IsHitTestVisible="True" Margin="262,219,0,0" Name="home_btn" VerticalAlignment="Top" Width="89">
<Button.Template>
    <ControlTemplate TargetType="{x:Type Button}">
        <Grid>
            <Image Name="Normal" Source="normal.png" />
            <Image Name="Hover" Source="hover.png" Opacity="0"/>
            <Image Name="Pressed" Source="pressed.png" Opacity="0" />
        </Grid>
        <ControlTemplate.Resources>
            <Storyboard x:Key="MouseDownTimeLine">
                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Pressed" Storyboard.TargetProperty="Opacity">
                    <SplineDoubleKeyFrame KeyTime="00:00:00.05" Value="1"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="MouseUpTimeLine">
                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Pressed" Storyboard.TargetProperty="Opacity">
                    <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="MouseEnterTimeLine">
                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Hover" Storyboard.TargetProperty="Opacity">
                    <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="1"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="MouseExitTimeLine">
                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Hover" Storyboard.TargetProperty="Opacity">
                    <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0"/>
                </DoubleAnimationUsingKeyFrames>
             </Storyboard>
        </ControlTemplate.Resources>
        <ControlTemplate.Triggers>
            <Trigger Property="ButtonBase.IsPressed" Value="True">
               <Trigger.EnterActions>
                   <BeginStoryboard Storyboard="{StaticResource MouseDownTimeLine}"/>
               </Trigger.EnterActions>
               <Trigger.ExitActions>
                   <BeginStoryboard Storyboard="{StaticResource MouseUpTimeLine}"/>
               </Trigger.ExitActions>
            </Trigger>
            <Trigger Property="UIElement.IsMouseOver" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource MouseEnterTimeLine}"/>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <BeginStoryboard Storyboard="{StaticResource MouseExitTimeLine}"/>
                </Trigger.ExitActions>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Button.Template>

答案 1 :(得分:1)

您可能应该使用VisualStateManager进行此类事情,请参阅其文档以获取用法示例。