添付プロパティを使用して、関連するScrollBarイベントを観察できます。次の例では、イベントリスナーを有効にするためにEnableUserScrollingObserver
という2つのプロパティを使用していて、IsUserScrolling
は現在のスクロール状態をレポートしています。
public static class Attached
{
public static bool GetEnableUserScrollingObserver(DependencyObject obj)
{
return (bool)obj.GetValue(EnableUserScrollingObserverProperty);
}
public static void SetEnableUserScrollingObserver(DependencyObject obj, bool value)
{
obj.SetValue(EnableUserScrollingObserverProperty, value);
}
public static readonly DependencyProperty EnableUserScrollingObserverProperty =
DependencyProperty.RegisterAttached("EnableUserScrollingObserver", typeof(bool), typeof(Attached),
new FrameworkPropertyMetadata(false, new PropertyChangedCallback(EnableUserScrollingObserverChanged)));
private static void EnableUserScrollingObserverChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var s = d as ScrollBar;
if (s != null)
{
s.Scroll -= Scrollbar_Scroll;
if ((bool)e.NewValue)
{
s.Scroll += Scrollbar_Scroll;
}
}
else
{
// Using this on anything other than a ScrollBar sucks
throw new InvalidOperationException("EnableUserScrollingObserver is designed for ScrollBar elements!");
}
}
static void Scrollbar_Scroll(object sender, ScrollEventArgs e)
{
var s = sender as ScrollBar;
switch (e.ScrollEventType)
{
case ScrollEventType.EndScroll:
SetIsUserScrolling(s, false);
break;
/* All the things handled by default
case ScrollEventType.First:
break;
case ScrollEventType.LargeDecrement:
break;
case ScrollEventType.LargeIncrement:
break;
case ScrollEventType.Last:
break;
case ScrollEventType.SmallDecrement:
break;
case ScrollEventType.SmallIncrement:
break;
case ScrollEventType.ThumbPosition:
break;
case ScrollEventType.ThumbTrack:
break;
*/
default:
SetIsUserScrolling(s, true);
break;
}
}
public static bool GetIsUserScrolling(DependencyObject obj)
{
return (bool)obj.GetValue(IsUserScrollingProperty);
}
public static void SetIsUserScrolling(DependencyObject obj, bool value)
{
obj.SetValue(IsUserScrollingProperty, value);
}
public static readonly DependencyProperty IsUserScrollingProperty =
DependencyProperty.RegisterAttached("IsUserScrolling", typeof(bool), typeof(Attached),
new FrameworkPropertyMetadata(false));
}
その後
<Style TargetType="ScrollBar">
<Setter Property="local:Attached.EnableUserScrollingObserver" Value="True"/>
<Setter Property="local:Attached.IsUserScrolling" Value="{Binding IsScrolling,Mode=OneWayToSource}"/>
</Style>
あなたのviewmodelにIsScrolling
プロパティをスクロール情報をつなぐ最後に、あなたのMainWindow_CollectionChanged
方法では、IsScrolling
プロパティのチェックを追加します。
*のように恒久的に無効*または単にマウスが押されている間? – grek40
スクロールバー上でマウスを押している間は無効にしてから、リリース時に有効な状態に戻します。 – Cosmin