【问题标题】:Time Delay on Trigger触发时间延迟
【发布时间】:2012-09-28 10:24:19
【问题描述】:

我希望在我的表单上的 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 中设置,也可以作为背后代码中的事件。

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

【问题讨论】:

    标签: wpf vb.net xaml mouseover expander


    【解决方案1】:

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

    【讨论】:

    • 感谢您的想法。我正在发布我确定的代码,但是因为你是第一个并且这个想法很好,你得到了答案! :)
    【解决方案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 中工作。如果您愿意,可以应用其他巧妙的技巧,我发现以下技巧对获得想法很有帮助:

    Animation Overview (MSDN)

    Storyboards Overview (MSDN)

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多