サーチ…


前書き

WPFビヘイビアーを使用すると、開発者は、システムおよびユーザーのイベントに応答してWPFコントロールの動作を変更できます。ビヘイビアは、 System.Windows.Interactity名前空間のBehaviorクラスを継承します。この名前空間は、最も包括的なExpression Blend SDKの一部ですが、ビヘイビアライブラリに適したより軽いバージョンは、[nugetパッケージ] [1]として利用できます。 [1]:https://www.nuget.org/packages/System.Windows.Interactivity.WPF/

マウスホイールイベントを傍受する簡単な動作

行動の実装

この動作により、内側のScrollViewerからのマウスホイールイベントが、内側のScrollViewerが上限または下限のいずれかにあるときに親ScrollViewerにバブルアップされます。この動作がなければ、イベントは内部のScrollViewerから決して出ないでしょう。

public class BubbleMouseWheelEvents : Behavior<UIElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.PreviewMouseWheel += PreviewMouseWheel;
    }

    protected override void OnDetaching()
    {
        this.AssociatedObject.PreviewMouseWheel -= PreviewMouseWheel;
        base.OnDetaching();
    }

    private void PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var scrollViewer = AssociatedObject.GetChildOf<ScrollViewer>(includeSelf: true);
        var scrollPos = scrollViewer.ContentVerticalOffset;
        if ((scrollPos == scrollViewer.ScrollableHeight && e.Delta < 0) || (scrollPos == 0 && e.Delta > 0))
        {
            UIElement rerouteTo = AssociatedObject;
            if (ReferenceEquals(scrollViewer, AssociatedObject))
            {
                rerouteTo = (UIElement) VisualTreeHelper.GetParent(AssociatedObject);
            }

            e.Handled = true;
            var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
            e2.RoutedEvent = UIElement.MouseWheelEvent;
            rerouteTo.RaiseEvent(e2);
        }
    }
}

BehaviorsはBehavior<T>基底クラスをサブクラス化しますTは、この場合UIElementにアタッチできるコントロールのタイプです。 BehaviorがXAMLからインスタンス化されると、 OnAttachedメソッドが呼び出されます。このメソッドは、( AssociatedControlを介して)アタッチされているコントロールからイベントにフックする動作を許可します。同様のメソッドOnDetachedは、ビヘイビアが関連付けられた要素からフック解除される必要があるときに呼び出されます。イベントハンドラを削除するか、またはメモリリークを回避するためにオブジェクトをクリーンアップするように注意する必要があります。

この動作により、 PreviewMouseWheelイベントがフックされ、 ScrollViewerれる前にイベントをインターセプトする変更が加えられます。位置を確認して、ビジュアルツリーの上にあるイベントをScrollViewer上位階層に転送する必要があるかどうかを確認します。そうであれば、 e.Handledtrueに設定してイベントのデフォルトアクションを防止します。次に、 AssociatedObjectルーティングされた新しいMouseWheelEventさせます。それ以外の場合、イベントは通常どおりルーティングされます。


XAMLの要素にビヘイビアをアタッチする

まず、XAMLでinteractivity xml-namespaceを使用する前に、そのinteractivity xml-namespaceに反映させる必要があります。 XAMLの名前空間に次の行を追加します。

xmlns:interactivity = " http://schemas.microsoft.com/expression/2010/interactivity "

動作は次のようにアタッチすることができます:

<ScrollViewer>
    <!--...Content...-->
    <ScrollViewer>
        <interactivity:Interaction.Behaviors>
            <behaviors:BubbleMouseWheelEvents />
        </interactivity:Interaction.Behaviors>
        <!--...Content...-->
    </ScrollViewer>
    <!--...Content...-->.
</ScrollViewer>

これは、作成Behaviorsの内側に添付プロパティとしてコレクションをScrollViewer含まBubbleMouseWheelEvents行動を。

この特定の動作は、 GridViewなどの埋め込みScrollViewerを含む既存のコントロールにもScrollViewer 、正しく機能します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow