2009-10-28 109 views
12

是否可以更改WPF ScrollViewer滾動的數量?我只是想知道是否可以更改滾動查看器,以便在使用鼠標滾輪或滾動查看器箭頭時可以更改增量滾動的數量。Wpf ScrollViewer Scroll Amount

回答

12

簡短的回答是:如果不編寫一些自定義滾動代碼,沒有辦法做到這一點,但不要讓它嚇倒你,它並不是那麼難。

ScrollViewer通過使用物理單位(即像素)進行滾動或通過與IScrollInfo實現結合使用來使用邏輯單位。這由設置the CanContentScroll property控制,其中值爲false表示「使用物理單位滾動內容」,值true表示「邏輯滾動內容」。

那麼ScrollViewer如何在邏輯上滾動內容?通過與IScrollInfo實現進行通信。因此,當某人執行邏輯操作時,您可以如何接管面板內容的滾動情況。 Take a look at the documentation for IScrollInfo以獲得可以請求滾動的所有測量邏輯單元的列表,但是由於您提到了鼠標滾輪,因此您將主要對MouseWheelUp/Down/Left/Right方法感興趣。

0

你可以在scrollviewer上實現一個行爲。在我的情況下,CanContentScroll沒有工作。下面的解決方案適用於滾動鼠標滾輪以及拖動滾動條。

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); 
    } 
} 

你會使用這樣的:

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

我這樣做是爲了確保scrollbar1.ValueChanged整數:

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