2017-08-20 3 views
0

J'utilise ListView pour afficher certains éléments, disons de hauteur 100. Dans le cas de nombreux éléments, la barre de défilement verticale est affichée avec les propriétés ScrollViewer. Cependant, lorsque l'utilisateur fait défiler la liste, il obtient la moitié défilée de l'écran à la fois, donc avec un défilement il couvre toute la vue de la liste.Comment faire pour modifier la quantité de défilement à travers Scroll Viewer dans UWP XAML/C#?

Je veux avoir du code pour définir la quantité de défilement, disons 100 hauteur à la fois. J'ai essayé en recherchant doc mais n'en ai trouvé aucun. En fait, les données proviennent de la liaison et le nombre d'éléments varie, mais c'est bien d'avoir une hauteur fixe pour chaque élément.

Exemple de code:

<ListView Name="lvSummaryList" ScrollViewer.VerticalScrollMode="Enabled" 
               ScrollViewer.IsVerticalRailEnabled="True" 
               VerticalAlignment="Bottom" 
               SelectionMode="None"           ScrollViewer.VerticalScrollBarVisibility="Auto" 
               ScrollViewer.HorizontalScrollMode="Disabled"    ScrollViewer.IsVerticalScrollChainingEnabled="True" 
               Margin="0,5,10,0" 
               MaxHeight="600" > 
       <ListView.ItemsPanel> 
        <ItemsPanelTemplate> 
         <ItemsWrapGrid Orientation="Horizontal" GroupPadding="1" Margin="1" MinHeight="100" MaxHeight="200" MaximumRowsOrColumns="4" VerticalAlignment="Center"/> 
        </ItemsPanelTemplate> 
       </ListView.ItemsPanel> 
</ListView> 

Comment cela, est-il bien ou même disponible pour remplacer le comportement actuel?

Répondre

1

Un moyen plus facile d'obtenir l'effet il semble que vous essayez d'atteindre est de permettre aux points d'accrochage sur le ScrollViewer.

Utilisez ce qui suit comme le style de votre ListView:

 <Style TargetType="ListView" 
       x:Key="SnapListViewStyle"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListView"> 
         <Border BorderBrush="{TemplateBinding BorderBrush}" 
           Background="{TemplateBinding Background}" 
           BorderThickness="{TemplateBinding BorderThickness}"> 
          <ScrollViewer x:Name="ScrollViewer" 
              TabNavigation="{TemplateBinding TabNavigation}" 
              HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" 
              HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" 
              IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}" 
              VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" 
              VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" 
              IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}" 
              IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" 
              IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" 
              VerticalSnapPointsAlignment="Near" 
              VerticalSnapPointsType="MandatorySingle" 
              ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}" 
              IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" 
              BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}" 
              AutomationProperties.AccessibilityView="Raw"> 
           <ItemsPresenter Header="{TemplateBinding Header}" 
               HeaderTemplate="{TemplateBinding HeaderTemplate}" 
               HeaderTransitions="{TemplateBinding HeaderTransitions}" 
               Footer="{TemplateBinding Footer}" 
               FooterTemplate="{TemplateBinding FooterTemplate}" 
               FooterTransitions="{TemplateBinding FooterTransitions}" 
               Padding="{TemplateBinding Padding}" /> 
          </ScrollViewer> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

Si cela ne donne pas l'effet que vous allez, essayez des valeurs différentes pour VerticalSnapPointsType et VerticalSnapPointsAlignment.

1

Vous pouvez essayer de définir la propriété SmallChange ou vous pouvez écouter l'événement Scroll de la barre verticale ScrollBar et ajuster la position ScrollBar de manière pragmatique selon les besoins. PS: Il existe d'autres façons d'obtenir une référence au scrollviewer de ListView comme indiqué.

public MainPage() 
    { 
     this.InitializeComponent(); 

     var scrollViewer = GetDescendants(lvSummaryList).OfType<ScrollViewer>().FirstOrDefault(); 
     var verticalScrollbar = GetDescendants(scrollViewer).OfType<ScrollBar>() 
      .FirstOrDefault(x => x.Orientation == Orientation.Vertical); 

     verticalScrollbar.SmallChange = 5; 

     //You can listen to the Scroll event of the vertical ScrollBar, and to pragmatically adjust the ScrollBar position 
     /*verticalScrollbar.Scroll += (o, e) => 
     { 
      if (e.ScrollEventType != ScrollEventType.EndScroll) 
       scrollViewer.ScrollToVerticalOffset(100); // Scroll to the top 

      if (e.NewValue >= verticalScrollbar.Maximum) 
       scrollViewer.ScrollToVerticalOffset(0); // Scroll to the top 
     };*/ 
    } 

    public static IEnumerable<DependencyObject> GetDescendants(DependencyObject start) 
    { 
     var queue = new Queue<DependencyObject>(); 
     var count = VisualTreeHelper.GetChildrenCount(start); 

     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(start, i); 
      yield return child; 
      queue.Enqueue(child); 
     } 

     while (queue.Count > 0) 
     { 
      var parent = queue.Dequeue(); 
      var count2 = VisualTreeHelper.GetChildrenCount(parent); 

      for (int i = 0; i < count2; i++) 
      { 
       var child = VisualTreeHelper.GetChild(parent, i); 
       yield return child; 
       queue.Enqueue(child); 
      } 
     } 
    } 
+0

Je reçois la valeur nulle pour ScrollViewer dans 'var ScrollViewer = getDescendants (lvSummaryList) .OfType () FirstOrDefault().' – usercr

+0

Est-ce que dans l'événement Loaded –

+1

Got, il fonctionne une fois source d'élément est défini . Ceci est très utile pour obtenir le défilement de la visionneuse par programmation et le petit changement fonctionne, mais d'autres réponses m'aident à obtenir un défilement régulier en particulier pour éviter de rebondir à la fin du défilement, le marquant comme accepté. – usercr