3

フォーム (VB.NET コード ビハインドでサポートされている xaml) にある WPF エキスパンダーのマウスオーバー イベントに時間遅延を付加したいと考えています。このマウスオーバー イベントは基本的に、クリックとは対照的に展開をトリガーしますが、コンテンツが展開されるまで少し待ちたいと思います。これまでのところ、より広いインターネットを介してこれを解決するものを見つけることができませんでした.

トリガーを有効にする現在の 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>

読みやすくするために、他の美学 (境界線、グリッド参照など) を取り除いていることに注意してください。

MouseOver Trigger に遅延を設定する方法があるはずだと思いますが、それを見つけることができませんでした。これは、xaml で設定するか、コード ビハインドのイベントとして設定できます。

私は現在これに取り組んでいるので、解決策を見つけたらここに投稿します。その間、どんなアイデアにも感謝します。ありがとう!

4

2 に答える 2

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 に答える
2

代わりに、MouseOver イベントで EventTrigger を使用し、BooleanAnimationUsingKeyFrames で Storyboard を使用します。ストーリーボードのタイムラインでは、変更するプロパティに影響を与える前にアニメーションがしばらく待機するように、キーフレームを設定できます。

于 2012-09-29T10:17:44.593 に答える