2016-05-06 2 views
0

J'ai une table avec des cellules, où les valeurs peuvent être insérées. La table est générée dynamiquement, en fonction des données. La taille de la table est limitée par la grille, où elle se trouve. Si les données sont trop nombreuses, une barre de défilement horizontale apparaît.WPF - ScrollViewer revient à la position de départ

Ceci est implémenté avec ItemsControl dans le ScrollViewer.

<ScrollViewer 
    VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto"> 
    <ItemsControl ItemsSource="{Binding Data}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Border> 
        <ItemsControl ItemsSource="{Binding Value}"> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <StackPanel/> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <Grid> 
            <Grid.RowDefinitions> 
             <RowDefinition SharedSizeGroup="SomeCellRowSize"/> 
            </Grid.RowDefinitions> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition SharedSizeGroup="SomeCellRowSize"/> 
            </Grid.ColumnDefinitions> 
            <TextBox 
             Text="{Binding Value.TotalTime}" 
             HorizontalContentAlignment="Right" BorderThickness="0" Margin="1,1,0,0"/> 
           </Grid> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </Border> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</ScrollViewer> 

Le problème se produit lorsque vous faites défiler la table vers la droite et sélectionnez une cellule (TextBox). Si nous faisons cela, ScrollViewer reviendra à la position la plus à gauche.

Répondre

3

Il est préférable d'avoir un ScrollViewer intégré dans le ItemsPanel lui-même que de l'entourer d'un ScrollViewer. D'après mon expérience, vous avez tendance à avoir plus de problèmes. Mettez à jour votre Template pour avoir le ScrollViewer à la place.

<ItemsControl ItemsSource="{Binding Data}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.Template> 
     <ControlTemplate> 
      <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
       <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border> 
       <ItemsControl ItemsSource="{Binding Value}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel/> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition SharedSizeGroup="SomeCellRowSize"/> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition SharedSizeGroup="SomeCellRowSize"/> 
           </Grid.ColumnDefinitions> 
           <TextBox 
            Text="{Binding Value.TotalTime}" 
            HorizontalContentAlignment="Right" BorderThickness="0" Margin="1,1,0,0"/> 
          </Grid> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl>