2017-05-10 1 views
0

J'ai un ItemControl sur un ScrollViewer. Je veux faire défiler élément par élément, défile maintenant pixel par pixel.ScrollViewer.CanContentScroll ne défile pas ItemsControl article par article

<ScrollViewer Height="299" Margin="10,10,0,0" 
HorizontalScrollBarVisibility="Visible" x:Name="Scroll" 
        VerticalAlignment="Top" 
        Grid.Column="0" Grid.Row="1" 
        PanningMode="HorizontalOnly" 
        CanContentScroll="True"> 
     <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Items, Mode=OneWay}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VirtualizingStackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border Width="175" Height="64" Margin="0,0,16,16" HorizontalAlignment="Center" Focusable="False"> 
         <TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 

Répondre

0

J'ai trouvé une solution

<ItemsControl ItemsSource="{Binding TypeHeaders}" 
             x:Name="ActivityItemsControl" 
             Grid.Column="0" Grid.Row="1"> 
          <ItemsControl.Template> 
           <ControlTemplate> 
            <ScrollViewer HorizontalScrollBarVisibility="Hidden" 
                VerticalScrollBarVisibility="Visible" 
                CanContentScroll="True"              
                x:Name="ActivityScrollViewer"> 
             <ItemsPresenter/> 
             <i:Interaction.Triggers> 
              <i:EventTrigger EventName="ScrollChanged"> 
               <cmd:EventToCommand PassEventArgsToCommand="True" 
                 Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Grid}}, Path=DataContext.VmCommands.ActivityScrollChangedCommand}" /> 
              </i:EventTrigger> 
             </i:Interaction.Triggers> 
            </ScrollViewer> 
           </ControlTemplate> 
          </ItemsControl.Template> 
          <ItemsControl.ItemTemplate> 
           <DataTemplate> 
            <Button Content="{Binding Description}" Style="{DynamicResource ZoneTypeHeaderButtonStyle}" 
                 Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.VmCommands.ZoneOverviewControlTypeHeaderClickedCommand}" 
                 CommandParameter="{Binding}"/> 
           </DataTemplate> 
          </ItemsControl.ItemTemplate> 
         </ItemsControl> 
0

Vous pouvez utiliser ListBox au lieu de ScrollViewer. Je pensais que vous ne vouliez pas avoir un style de sélection donc je l'ai changé.

<ListView ScrollViewer.CanContentScroll="True" 
       ScrollViewer.VerticalScrollBarVisibility="Hidden" 
       ScrollViewer.PanningMode="HorizontalOnly" 
       ScrollViewer.HorizontalScrollBarVisibility="Visible" 
       ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Items, Mode=OneWay}"> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="{x:Type ListViewItem}"> 
       <Setter Property="Background" Value="Transparent" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type ListViewItem}"> 
          <ContentPresenter /> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListView.ItemContainerStyle> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Border Width="175" Height="64" Margin="0,0,16,16" HorizontalAlignment="Center" Focusable="False"> 
        <TextBlock Text="{Binding }" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Border> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
+0

Merci @ Jarosław Rejterada, mais je dois attraper les événements de défilement du spectateur de défilement et changer ScrollingOffset de code. Aussi, je veux utiliser l'événement pour commander à partir de la lumière mvvm. –

+0

C'est encore possible, vous pouvez modifier le modèle pour la vue liste et là vous avez un accès complet à scrollviewer. (pour générer un modèle de base Cliquez avec le bouton droit de la souris sur le concepteur -> EditTemplate -> Modifier la copie). Ou voir http://stackoverflow.com/questions/1585462/bubbling-scroll-events-from-a-listview-to-its-parent –

1

Il suffit de définir cette propriété sur ListBox:

VirtualizingStackPanel.ScrollUnit ="Item" 

Un autre mode est "pixel", qui est le mode par défaut.