2011-10-14 4 views
1

J'ai besoin de changer la fenêtre d'affichage de la grille de données au maximum afin que toutes les lignes soient propagées dans le constructeur. J'ai donc utilisé Scrollview avec la hauteur de ligne définie sur auto.Modification de la fenêtre d'affichage de la grille de données

<ScrollViewer> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
     </Grid.RowDefinitions> 

     <DataGrid> 

     </DataGrid> 
    </Grid> 
</ScrollViewer> 

Ceci propage tous les contrôles mais maintenant, quand j'utilise la barre de défilement, il déplace également la ligne d'en-tête. J'ai besoin que la barre de défilement affecte uniquement DataGrid.

Répondre

1

Je ne comprends pas cette déclaration

... besoin de changer de fenêtre DataGrid maximum pour toutes les lignes sont propagées dans le constructeur. Alors je ScrollView avec une hauteur de ligne du jeu à automatique ...

... où est le paramètre Viewport dans le code? Aussi, quel est ce constructor? Vos terminologies prêtent à confusion ...

Cependant, je peux supposer ce que vous voulez est que la grille de données rende entièrement ses rangées (sans espace supplémentaire sous les rangées) et occupe cela directement sur le panneau de grille. Mais comme vous avez utilisé un afficheur de défilement abone grid, il fera également défiler les en-têtes de DataGrid.

Si vous utilisez « Snoop », vous trouverez que DataGrid WPF dispose d'une visionneuse de défilement comme son enfant visuel et il a un panneau Grid dans son propre modèle, il le ScrollContentPresenter est sous Grid.Row qui a RowDefinition qui a Height comme asterick (*)

En utilisant la méthode d'extraction des enfants visuels donnée ci-dessous, les accès descendent en grille et changent sa hauteur en auto.

(GetVisualChild<Grid>(myDataGrid)).RowDefintions[1].Height="Auto" 

Méthode de fouiner à travers tous les enfants d'un parent ...

static T GetVisualChild<T>(Visual parent) where T : Visual 
    { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
       Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
       child = v as T; 
       if (child == null) child = GetVisualChild<T>(v); 
       if (child != null) break; 
     } 

     return child; 
    } 

La façon XAML

Remplacer le modèle de contrôle dataGrid ...

<Style TargetType="{x:Type DataGrid}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGrid}"> 
     <Border Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       SnapsToDevicePixels="True" 
       Padding="{TemplateBinding Padding}"> 
     <ScrollViewer Focusable="false" 
         Name="DG_ScrollViewer"> 
      <ScrollViewer.Template> 
      <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
       <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> <!--This changed to Auto from '*'--> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 

       <!--Left Column Header Corner --> 
       <Button Command="{x:Static dg:DataGrid.SelectAllCommand}" 
         Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=CellsPanelHorizontalOffset}" 
         Template="{StaticResource SelectAllButtonTemplate}" 
         Focusable="false" 
         Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=HeadersVisibility, Converter={x:Static dg:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static dg:DataGridHeadersVisibility.All}}" /> 
       <!--Column Headers--> 
       <dgp:DataGridColumnHeadersPresenter Grid.Column="1" 
                Name="PART_ColumnHeadersPresenter" 
                Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=HeadersVisibility, Converter={x:Static dg:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static dg:DataGridHeadersVisibility.Column}}"/> 

       <!--DataGrid content--> 
       <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="1" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" /> 

       <ScrollBar Grid.Row="1" Grid.Column="2" Name="PART_VerticalScrollBar" 
             Orientation="Vertical" 
             Maximum="{TemplateBinding ScrollableHeight}" 
             ViewportSize="{TemplateBinding ViewportHeight}" 
             Value="{Binding Path=VerticalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
             Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/> 

       <Grid Grid.Row="2" Grid.Column="1"> 
        <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/> 
        <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <ScrollBar Grid.Column="1" 
          Name="PART_HorizontalScrollBar" 
          Orientation="Horizontal" 
          Maximum="{TemplateBinding ScrollableWidth}" 
          ViewportSize="{TemplateBinding ViewportWidth}" 
          Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
          Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/> 

       </Grid> 
       </Grid> 
      </ControlTemplate> 
      </ScrollViewer.Template> 
      <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
     </ScrollViewer> 
     </Border> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Remerciez toi. Vous avez compris mon intention. Est-il possible de le faire en XAML? – sergman

+0

Si vous insistez en XAML, alors vous devrez surcharger tout le modèle 'DataGrid' pour faire un simple changement comme ça. Es-tu d'accord avec ça? Si oui, alors voir ma réponse éditée ci-dessus ... –

+0

J'ai mis en œuvre la première façon et également activé le défilement vertical mais lorsque les données sont chargées, le défilement devient désactivé et je ne peux pas l'utiliser. – sergman

Questions connexes