サーチ…
前書き
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.Handled
をtrue
に設定してイベントのデフォルトアクションを防止します。次に、 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
、正しく機能します。