次の例では、数十個のフォント名を含む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>
ソリューションの問題は、おそらくListBox内に配置したいListBoxの周りにスクロールバーを配置していることです。
ListBoxでスクロールバーを強制する場合は、ScrollBar.VerticalScrollBarVisibility添付プロパティを使用します。
<ListBox
ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>
この値をAutoに設定すると、必要に応じてスクロールバーがポップアップします。
ListBox
には既にScrollViewer
が含まれています。デフォルトでは、スペースよりもコンテンツが多い場合にScrollBar
が表示されます。ただし、一部のコンテナは、コンテンツ(たとえばStackPanel
)に合わせてサイズを変更するため、「スペースよりもコンテンツが多い」ことはありません。そのような場合、ListBox
には常にコンテンツに必要なスペースが与えられます。
スペースよりもコンテンツが多いという条件を計算するには、サイズを知る必要があります。 ListBox
要素自体に明示的にサイズを設定するか、[ホスト]パネルからListBox
のサイズが制限されていることを確認してください。
ホストパネルが垂直StackPanel
で、VerticalScrollBar
が必要な場合は、ListBox
自体の高さを設定する必要があります。他の種類のコンテナの場合、例えばGrid
、ListBox
はコンテナによって制約できます。たとえば、元のコードを次のように変更できます。
<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
ですが、そのGrid
はStackPanel
に含まれているため、外側のStackPanel
はその即時コンテナを収容するために展開されますchild Grid
。その子がits child(ListBox
)に対応するように展開できるように。
ListBox
の高さを設定するか、内側のGrid
の高さを設定するか、単に外側のコンテナをGrid
にすることにより、任意のポイントで高さを制限する場合—次に、リスト項目が多すぎてコントロールに収まらない場合は常に、垂直スクロールバーが自動的に表示されます。
リストボックスに「高さ」を追加し、スクロールバーをうまく追加しました。
スクロールバーは、その表示が非表示に設定されていない限り、リストボックスに自動的に追加されます。リストアイテムのサイズが1つを超えると、実行時にリストボックス内に表示できる垂直または水平のリストボックスが表示されます。
私の場合、ListBoxのアイテムの数は動的であるため、Heightプロパティを使用したくありませんでした。代わりにMaxHeightを使用しましたが、うまく機能します。スクロールバーは、割り当てられたスペースがいっぱいになると表示されます。
XAML ListBox Scroller-Windows 10(UWP)
<Style TargetType="ListBox">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>
私は同じ問題を抱えていました。StackPanelにComboBoxに続いてListBoxがあり、ListBoxのスクロールバーが表示されませんでした。代わりに2つをDockPanelに入れることでこれを解決しました。 ComboBox DockPanel.Dock = "Top"を設定し、残りのスペースをListBoxで埋めます。