2009-10-28 16 views
12

Czy można zmienić liczbę przewijanych widoków przewijania WPF? Po prostu zastanawiam się, czy można zmienić przeglądarkę tak, że przy użyciu kółka myszy lub strzałek przewijania można zmienić stopień przewijania przyrostowego.Ilość przewijania w Przf ScrollViewer

Odpowiedz

12

Krótka odpowiedź brzmi: nie da się tego zrobić bez napisania niestandardowego kodu przewijania, ale nie daj się przestraszyć, to nie jest takie trudne.

ScrollViewer działa poprzez przewijanie przy użyciu jednostek fizycznych (np. Pikseli) lub angażując się w implementację IScrollInfo w celu użycia jednostek logicznych. Jest to kontrolowane przez ustawienie the CanContentScroll property, gdzie wartość false oznacza "przewijanie zawartości za pomocą jednostek fizycznych", a wartość prawdziwych środków "przewijaj zawartość logicznie".

W jaki sposób program ScrollViewer przewija zawartość w sposób logiczny? Komunikując się z implementacją IScrollInfo. W ten sposób można przejąć dokładnie to, ile zawartość panelu przewija, gdy ktoś wykonuje logiczną akcję. Take a look at the documentation for IScrollInfo, aby uzyskać listę wszystkich logicznych jednostek miary, które mogą być wymagane do przewijania, ale ponieważ wspomniałeś o kółku myszy, będziesz najbardziej zainteresowany metodami MouseWheelUp/Down/Left/Right.

0

Możesz zaimplementować zachowanie w przeglądarce przewijania. W moim przypadku CanContentScroll nie działa. Poniższe rozwiązanie służy do przewijania za pomocą kółka myszy, a także do przeciągania paska przewijania.

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

będzie go używać tak:

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

Zrobiłem to, aby zapewnić liczb całkowitych na scrollbar1.ValueChanged:

scrollbar1.Value = Math.Round(scrollbar1.Value, 0, MidpointRounding.AwayFromZero) 
Powiązane problemy