2009-05-15 8 views
0

Ich habe eine WPF ListBox, die in der Regel 4 oder 5 Elemente zeigt. Für meine Anwendung bedeutet das, dass ich fast nie eine Bildlaufleiste anzeigen muss (es ist genug Platz vorhanden).ListView Bildlaufleiste vermasselt mein Layout

Wenn jedoch mehr Elemente in der Liste sind, muss ich die vertikale Bildlaufleiste anzeigen, aber als Ergebnis hat mein Inhalt weniger Platz und sieht auf einem "Hintergrund", den ich erstellt habe, nicht mehr gut aus hinter der Listbox.

Ich mag "Raum" in meinem Layout für die Scrollbar zu "reservieren". Gibt es eine Möglichkeit, das zu tun? (möglicherweise mit der Bildlaufleiste überlagert auf den Inhalt)

Antwort

0

In Ordnung, eine Lösung gefunden.

Ich habe einen neuen Standardstil für den ScrollViewer erstellt, indem ich this MSDN article folge. Dann habe ich den Teil geändert, an dem die Bildlaufleisten platziert sind.

Original-Verhalten

<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> 

Neues Verhalten

<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> 

Nun wird die Bildlaufleisten auf dem Inhalt überlagert werden, so dass sie, wenn sichtbar keinen zusätzlichen Platz in Anspruch nehmen. Natürlich sollte der Inhalt jetzt Platz für den Inhalt reservieren.

+0

Der Nachteil davon ist, dass die Bildlaufleisten auf den Inhalt angezeigt werden und möglicherweise obskuren einige davon. –

0

Wie wäre es mit einem ScrollViewr Wrapping?

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

Dies ist nicht mein Problem zu lösen, die Scrollbar noch Raum nimmt –

0

Wie Sie in Ihrer Frage gesagt haben, müssen Sie nur die Breite für die vertikale Bildlaufleiste reservieren, die folgende XAML-Code gibt Ihnen eine Idee.

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

     <Listbox .../> 
    </Grid> 
</ScrollViewer> 
Verwandte Themen