2009-01-23 52 views
66

在下面的例子中,我有一個列表框,裏面有幾十個字體名稱。如何在我的ListBox中獲得垂直滾動條?

我原以爲它會自動有一個垂直滾動條,以便您可以選擇任何字體,不只是列表中的第一個,但它不會。

因此我添加了一個「ScrollViewer」,並在右側放置了一個「滾動條區域」,但滾動條區域沒有滾動條,因此您可以滾動(!)。

爲什麼不是一個滾動條自動,我該如何強制它有一個滾動條?

<StackPanel Name="stack1"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="2*"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <ScrollViewer> 
      <ListBox Grid.Row="0" Name="lstFonts" Margin="3" ItemsSource="{x:Static Fonts.SystemFontFamilies}"/> 
     </ScrollViewer> 
    </Grid> 
</StackPanel> 

回答

116

你的解決方案的問題是你將一個滾動條放在ListBox中,你可能想把它放在ListBox中。

如果您想在ListBox中強制滾動條,請使用ScrollBar.VerticalScrollBarVisibility附加屬性。

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible"> 
</ListBox> 

將此值設置爲自動將根據需要彈出滾動條。

+1

在我來說,我已經把`ListBox`一個`ScrollViewer`太和`ListBoxItems`內被拉伸寬因爲他們想要超出`ListBox`的大小。刪除`ScrollViewer`並設置`ScrollViewer.VerticalScrollBarVisibility =「可見」`和`ScrollViewer.Horizo​​ntalScrollBarVisibility =「已禁用」`訣竅。 謝謝你的幫助! – mandarin 2015-05-18 14:56:57

16

我給列表框添加了一個「高度」,它很好地添加了滾動條。

+6

儘量避免使用高度和寬度屬性,因爲它們可能會使道路上的變​​化變得困難。使用JaredPar的解決方案最好。 – 2009-01-23 15:08:10

+0

我這樣做,但它只是把一個「滾動條區域」向右,沒有滾動條本身,我的列表下來超過我的窗口底部到所有永恆,我怎麼能告訴列表框(停在底部的窗口)? – 2009-01-23 16:28:24

3

滾動條會自動添加到列表框中,除非其可見性設置爲隱藏。每當列表項的大小超過一個,可以在列表框內顯示垂直或水平列表框可以在運行時間內看到。

23

ListBox已經包含ScrollViewer。默認情況下,ScrollBar將出現時,有更多的內容比空間。但是一些容器會自行調整大小以適應其內容(例如StackPanel),所以永遠不會有「比空間更多的內容」。在這種情況下,ListBox總是會獲得儘可能多的內容空間。

爲了計算擁有比空間更多的內容的條件,大小應該是已知的。確保您的ListBox的尺寸受到限制,或者通過在ListBox元素本身或從主機面板明確設置尺寸。

如果主機面板是垂直的StackPanel並且您想要VerticalScrollBar您必須在ListBox本身上設置高度。對於其他類型的容器,例如GridListBox可以被容器約束。例如,你可以改變你原來的代碼看起來像這樣:

<Grid Name="grid1"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="2*"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <ListBox Grid.Row="0" Name="lstFonts" Margin="3" 
       ItemsSource="{x:Static Fonts.SystemFontFamilies}"/> 
    </Grid> 
</Grid> 

注意,它不只是眼前的容器,這是非常重要的。在你的榜樣,直接容器是Grid,而是因爲GridStackPanel載,外StackPanel擴展,以適應其直接子Grid,使得孩子可以擴展以容納孩子(的ListBox)。

如果通過設置ListBox的高度,通過設定內Grid的高度限制在任何點—高度,或簡單地通過使外容器Grid —然後垂直滾動條會自動出現的任何時間有太多的列表項目要放在控件中。

1

在我的情況下,ListBox中的項數是動態的,所以我不想使用Height屬性。我使用了MaxHeight,而且效果很好。當它填滿我爲它分配的空間時,滾動條就會出現。

0

我遇到了同樣的問題,我有一個ComboBox,後面跟着一個StackPanel中的ListBox,ListBox的滾動條沒有顯示出來。我通過將兩者放入DockPanel來解決此問題。我設置了ComboBox DockPanel.Dock =「Top」,並讓ListBox填充剩餘空間。

0

XAML的ListBox滾輪 - 視窗10(UWP)

<Style TargetType="ListBox"> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/> 
</Style>