2009-10-28 102 views
12

WPF ScrollViewerがスクロールする量を変更することはできますか?スクロールビューアを変更してマウスホイールまたはスクロールビューアの矢印を使用した場合、スクロールバーの増分を変更できるかどうかは疑問です。Wpf ScrollViewerスクロール量

答えて

12

短い答えは、いくつかのカスタムスクロールコードを書くことなくこれを行う方法はありませんが、恐ろしいことではありません。

ScrollViewerは、物理ユニット(つまりピクセル)を使用してスクロールしたり、論理ユニットを使用するためにIScrollInfo実装を使用して動作します。これは設定the CanContentScroll propertyによって制御されます。値がfalseの場合は「物理ユニットを使用してコンテンツをスクロールする」を意味し、値がtrueの場合は「コンテンツを論理的にスクロールする」を意味します。

したがって、ScrollViewerは内容を論理的にスクロールしますか? IScrollInfo実装と通信する。そういうわけで、誰かが論理的な行動をしたときにパネルの内容がスクロールする量を正確に引き継ぐ方法です。 Take a look at the documentation for IScrollInfoを使用してスクロールするように要求できるすべての論理単位のリストを取得しますが、マウスホイールについて言及して以来、MouseWheelUp/Down/Left/Rightメソッドにほとんど興味があります。

0

スクロールビューアでビヘイビアを実装できます。私の場合、CanContentScrollは機能しませんでした。以下のソリューションは、マウスホイールでスクロールしたり、スクロールバーをドラッグしたりするためのものです。私はscrollbar1.ValueChangedに全体の数字を確実にするためにこれをした

<ScrollViewer MaxHeight="248" 
       VerticalScrollBarVisibility="Auto"> 
    <i:Interaction.Behaviors> 
     <behaviors:StepSizeBehavior StepSize="62" /> 
    </i:Interaction.Behaviors> 
0

scrollbar1.Value = Math.Round(scrollbar1.Value, 0, MidpointRounding.AwayFromZero) 

public class StepSizeBehavior : Behavior<ScrollViewer> 
{ 
    public int StepSize { get; set; } 

    #region Attach & Detach 
    protected override void OnAttached() 
    { 
     CheckHeightModulesStepSize(); 
     AssociatedObject.ScrollChanged += AssociatedObject_ScrollChanged; 
     base.OnAttached(); 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.ScrollChanged -= AssociatedObject_ScrollChanged; 
     base.OnDetaching(); 
    } 
    #endregion 

    [Conditional("DEBUG")] 
    private void CheckHeightModulesStepSize() 
    { 
     var height = AssociatedObject.Height; 
     var remainder = height%StepSize; 
     if (remainder > 0) 
     { 
      throw new ArgumentException($"{nameof(StepSize)} should be set to a value by which the height van be divised without a remainder."); 
     } 
    } 

    private void AssociatedObject_ScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     const double stepSize = 62; 
     var scrollViewer = (ScrollViewer)sender; 
     var steps = Math.Round(scrollViewer.VerticalOffset/stepSize, 0); 
     var scrollPosition = steps * stepSize; 
     if (scrollPosition >= scrollViewer.ScrollableHeight) 
     { 
      scrollViewer.ScrollToBottom(); 
      return; 
     } 
     scrollViewer.ScrollToVerticalOffset(scrollPosition); 
    } 
} 

あなたはこのようにそれを使用します

関連する問題