【问题标题】:DoubleAnimation Height not returning to original value after trigger event is not being triggered anymore不再触发触发事件后,DoubleAnimation Height 未返回原始值
【发布时间】:2013-07-02 13:55:42
【问题描述】:

我正在尝试在我的列表框中添加一些样式,创建列表框时它具有一个项目的大小,当鼠标悬停时,它应该增加它的高度以适应 5 个项目,到目前为止一切都很好,但是因为当用户将鼠标移到另一个字段上时它会变得很烦人,所以看到它增长并恢复到原来的大小会很烦人。

所以我决定为这个 ListBox 尝试带有 DoubleAnimation 的 Storyboards。我达到了这个:

    <Style TargetType="ListBox">
        <Setter Property="VerticalAlignment" Value="Top" />
        <Setter Property="Height" Value="20" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard BeginTime="0:0:.25">
                            <DoubleAnimation Storyboard.TargetProperty="Height" From="20" To="85" Duration="0:0:0"/>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.EnterActions>
                <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
            </Trigger>
        </Style.Triggers>
    </Style>

好的,这行得通。完美,我几乎已经感觉很专业了。但是当我去测试时,我遇到了问题。当鼠标不再悬停时,列表框不会恢复到原来的大小。所以我决定反其道而行之,尝试使用Property="IsMouseOver" Value="False" 切换 FromTo 值。 ListBox 不会移动。

所以我尝试了一个我在 StackOverflow 中看到的关于 DataTemplate.Triggers 的答案,但得到了相同的结果。

我不知道还有什么可以尝试的,因为我对 WPF 知识的缺乏每次都会妨碍我。

对此有什么好的选择?提前致谢,欢迎随时提出意见。

【问题讨论】:

    标签: c# wpf xaml styles storyboard


    【解决方案1】:

    Trigger.ExitActions 中使用额外的返回Storyboard

    <Trigger.ExitActions>
        <BeginStoryboard>
            <Storyboard BeginTime="0:0:.25">
                <DoubleAnimation Storyboard.TargetProperty="Height"
                                 From="85" To="20" Duration="0:0:0"/>
            </Storyboard>
        </BeginStoryboard>
    </Trigger.ExitActions>
    

    没有Storyboard 默认保存该值。见FillBehavior Property


    如果IsMouseOver 为真,您也可以设置FillBehavior="Stop" 并设置新的Height 值,就像您为ScrollViewer.VerticalScrollBarVisibility 所做的那样。

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Height" From="20" To="85"
                                         Duration="0:0:0.5" FillBehavior="Stop" />
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
            <Setter Property="Height" Value="85" />
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
        </Trigger>
    </Style.Triggers>
    

    【讨论】:

    • 效果很好。非常感谢。但只有一件事,当 Storyboard 被触发时,我的背景事件也不会被触发。有没有办法解决这个问题? :X 在此先感谢,非常感谢。
    • 你是什么背景事件?
    • MouseLeave="ListBox_MouseLeave" 在这种情况下,我只是在 ListBox 具有仅显示一项的长度时显示所选项目。
    • 如果鼠标悬停在 ListBox 上并触发 IsMouseOver,为什么会触发此事件?我试过了,如果鼠标离开 ListBox,它就会触发。预期行为。
    • 我不知道。对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多