2009-05-15 5 views
0

J'ai un ListBox WPF qui affiche généralement 4 ou 5 éléments. Pour mon application, cela signifie que je n'ai presque jamais besoin d'afficher une barre de défilement (il y a assez d'espace). Cependant, au cas où il y aurait plus d'éléments dans la liste, j'ai besoin d'afficher la barre de défilement verticale, mais par conséquent mon contenu a moins d'espace et n'a plus l'air sympa sur un "backdrop" que j'ai créé derrière la liste. J'aime réserver la pièce dans ma disposition pour que la barre de défilement apparaisse. Y-a-t-il un moyen de faire ça? (peut-être avoir la barre de défilement superposée sur le contenu)La barre de défilement de ListView gâche ma mise en page

Répondre

0

D'accord, trouvé une solution.

J'ai créé un nouveau style par défaut pour le ScrollViewer en suivant this MSDN article. Ensuite, j'ai changé la partie où les barres de défilement sont placées.

comportement original

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto"/> 
    <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="*"/> 
    <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <Border Grid.Row="0" Grid.Column="1"> 
    <ScrollContentPresenter CanContentScroll="True" Content="{TemplateBinding ScrollViewer.Content}" /> 
    </Border> 
    <ScrollBar Orientation="Vertical" Grid.Row="0" Grid.Column="0" Minimum="0" Maximum="{TemplateBinding ScrollViewer.ScrollableHeight}" Value="{TemplateBinding ScrollViewer.VerticalOffset}" ViewportSize="{TemplateBinding ScrollViewer.ViewportHeight}" Name="PART_VerticalScrollBar" Visibility="{TemplateBinding ScrollViewer.ComputedVerticalScrollBarVisibility}" /> 
    <ScrollBar Orientation="Horizontal" Grid.Row="1" Grid.Column="1" Minimum="0" Maximum="{TemplateBinding ScrollViewer.ScrollableWidth}" Value="{TemplateBinding ScrollViewer.HorizontalOffset}" ViewportSize="{TemplateBinding ScrollViewer.ViewportWidth}" Name="PART_HorizontalScrollBar" Visibility="{TemplateBinding ScrollViewer.ComputedHorizontalScrollBarVisibility}"/> 
</Grid> 

Nouveau comportement

<Grid> 
    <!-- Presentation below is different from the default: the scrollbar is overlayed on the content. --> 
    <ScrollContentPresenter CanContentScroll="True" Content="{TemplateBinding ScrollViewer.Content}" /> 
    <ScrollBar Orientation="Vertical" HorizontalAlignment="Right" Minimum="0" Maximum="{TemplateBinding ScrollViewer.ScrollableHeight}" Value="{TemplateBinding ScrollViewer.VerticalOffset}" ViewportSize="{TemplateBinding ScrollViewer.ViewportHeight}" Name="PART_VerticalScrollBar" Visibility="{TemplateBinding ScrollViewer.ComputedVerticalScrollBarVisibility}" /> 
    <ScrollBar Orientation="Horizontal" VerticalAlignment="Bottom" Minimum="0" Maximum="{TemplateBinding ScrollViewer.ScrollableWidth}" Value="{TemplateBinding ScrollViewer.HorizontalOffset}" ViewportSize="{TemplateBinding ScrollViewer.ViewportWidth}" Name="PART_HorizontalScrollBar" Visibility="{TemplateBinding ScrollViewer.ComputedHorizontalScrollBarVisibility}"/> 
</Grid> 

Maintenant, les barres de défilement sont superposées sur le contenu afin qu'ils ne prennent pas plus d'espace quand il est visible. Bien sûr, le contenu devrait maintenant réserver de l'espace pour le contenu.

+0

L'inconvénient est que les barres de défilement apparaîtront au-dessus du contenu et peut-être obscure partie. –

0

Qu'en est-il d'envelopper avec un ScrollViewr?

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
<!-- your ListBoxHere -->   
</ScrollViewer> 
+0

Cela ne résout pas mon problème, la barre de défilement prend encore l'espace –

0

Comme vous l'avez dit dans votre question, il vous suffit de réserver la largeur de la barre de défilement verticale, le code XAML suivant vous donnera une idée.

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="30"/> <!-- reserved for the vertical scrollbar --> 
     </Grid.ColumnDefinitions> 

     <Listbox .../> 
    </Grid> 
</ScrollViewer> 
Questions connexes