2009-10-28 9 views
12

Ist es möglich, die Menge zu ändern, die der WPF ScrollViewer scrollt? Ich frage mich nur, ob es möglich ist, den Scrollviewer zu ändern, so dass bei Verwendung des Mausrads oder der Scrollviewer-Pfeile der Umfang des inkrementellen Scrollens geändert werden kann.Wpf ScrollViewer Scroll-Betrag

Antwort

12

Die kurze Antwort ist: Es gibt keine Möglichkeit, dies zu tun, ohne einige benutzerdefinierte Scroll-Code zu schreiben, aber lassen Sie sich das nicht erschrecken, es ist nicht so schwer.

Der ScrollViewer funktioniert entweder durch Scrollen mit physikalischen Einheiten (z. B. Pixel) oder durch Verwenden einer IScrollInfo-Implementierung, um logische Einheiten zu verwenden. Dies wird durch die Einstellung the CanContentScroll property gesteuert, wobei ein Wert von false bedeutet "scrolle den Inhalt mit physischen Einheiten" und ein Wert von true bedeutet "scrolle den Inhalt logisch".

Wie scrollt der ScrollViewer den Inhalt logisch? Durch die Kommunikation mit einer IScrollInfo-Implementierung. Auf diese Weise können Sie genau bestimmen, um wie viel der Inhalt Ihres Panels gescrollt wird, wenn jemand eine logische Aktion ausführt. Take a look at the documentation for IScrollInfo, um eine Liste aller logischen Maßeinheiten zu erhalten, die zum Scrollen angefordert werden können, aber da Sie das Mausrad erwähnt haben, werden Sie hauptsächlich an den MouseWheelUp/Down/Left/Right-Methoden interessiert sein.

0

Sie könnten ein Verhalten auf dem Scrollviewer implementieren. In meinem Fall CanContentScroll hat nicht funktioniert. Die folgende Lösung dient zum Scrollen mit dem Mausrad sowie zum Bewegen der Bildlaufleiste.

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

Sie würde es so verwenden:

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

Ich habe diese ganze Zahlen auf scrollbar1.ValueChanged sicherzustellen:

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