3

我希望在我的表单上的 WPF 扩展器上的鼠标悬停事件上附加一个时间延迟(后面的 VB.NET 代码支持 xaml)。此鼠标悬停事件本质上触发了与单击相反的扩展-但我希望在扩展内容之前稍等片刻。到目前为止,我还没有设法通过更广泛的互联网找到任何解决此问题的方法。

当前启用触发器的 xaml 代码是:

    <Style x:Key="HoverExpander" TargetType="{x:Type Expander}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="IsExpanded" Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>

然后将此样式应用于:

<Expander Style="{StaticResource HoverExpander}" 
          HorizontalAlignment="Right"
          ExpandDirection="Left" 
          Height="Auto" 
          Width="Auto">
           <!-- Content here -->
</Expander>

请注意,我已经去掉了其他美学(例如边框、gridrefs 等以提高可读性)。

我认为应该有一些方法来设置鼠标悬停触发器的延迟,但没有找到它的运气。这可以在 xaml 中设置,也可以作为后面代码中的事件。

我目前正在研究这个,所以当我找到解决方案时,我会在这里发布。同时感谢任何想法。谢谢!

4

2 回答 2

2

在 MouseOver 事件上使用 EventTrigger,而在 Storyboard 上使用 BooleanAnimationUsingKeyFrames。在情节提要的时间轴中,您可以有关键帧,以便动画在影响您要更改的属性之前等待一段时间。

于 2012-09-29T10:17:44.593 回答
2

这是我确定的代码 - 基于已经给出的想法:

    <Style x:Key="HoverExpander" TargetType="{x:Type Expander}">            
        <Style.Setters>                
            <Setter Property="IsExpanded" Value="False"/><!-- Initially collapsed -->            
        </Style.Setters>

        <Style.Triggers>
            <!-- Impose a short delay (500ms) before expanding control -->
            <EventTrigger RoutedEvent="Expander.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames
                            Storyboard.TargetProperty="IsExpanded"
                            Duration="0:0:0.5">
                            <DiscreteBooleanKeyFrame Value="True" KeyTime="100%"/><!-- I.E. after 500ms -->                             
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <!-- Collapse when mouse leaves control-->
            <EventTrigger RoutedEvent="Expander.MouseLeave">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames
                            Storyboard.TargetProperty="IsExpanded"
                            Duration="0:0:0.1">
                            <DiscreteBooleanKeyFrame Value="False" KeyTime="0%"/><!-- I.E. Immediately -->

                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

然后像以前一样申请。这已经过测试并在 .NET 4.0 中工作。如果您愿意,可以应用其他巧妙的技巧,我发现以下内容对获得想法很有帮助:

动画概述 (MSDN)

故事板概述 (MSDN)

于 2012-10-02T11:56:45.173 回答