web-dev-qa-db-ja.com

リストボックスで垂直スクロールバーを取得するにはどうすればよいですか?

次の例では、数十個のフォント名を含む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>
79
Edward Tanguay

ソリューションの問題は、おそらくListBox内に配置したいListBoxの周りにスクロールバーを配置していることです。

ListBoxでスクロールバーを強制する場合は、ScrollBar.VerticalScrollBarVisibility添付プロパティを使用します。

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

この値をAutoに設定すると、必要に応じてスクロールバーがポップアップします。

136
JaredPar

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はその即時コンテナを収容するために展開されますchild Grid。その子がits child(ListBox)に対応するように展開できるように。

ListBoxの高さを設定するか、内側のGridの高さを設定するか、単に外側のコンテナをGridにすることにより、任意のポイントで高さを制限する場合—次に、リスト項目が多すぎてコントロールに収まらない場合は常に、垂直スクロールバーが自動的に表示されます。

26
yossharel

リストボックスに「高さ」を追加し、スクロールバーをうまく追加しました。

18
Edward Tanguay

スクロールバーは、その表示が非表示に設定されていない限り、リストボックスに自動的に追加されます。リストアイテムのサイズが1つを超えると、実行時にリストボックス内に表示できる垂直または水平のリストボックスが表示されます。

3
Paras

私の場合、ListBoxのアイテムの数は動的であるため、Heightプロパティを使用したくありませんでした。代わりにMaxHeightを使用しましたが、うまく機能します。スクロールバーは、割り当てられたスペースがいっぱいになると表示されます。

1
oldDavid

XAML ListBox Scroller-Windows 10(UWP)

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

私は同じ問題を抱えていました。StackPanelにComboBoxに続いてListBoxがあり、ListBoxのスクロールバーが表示されませんでした。代わりに2つをDockPanelに入れることでこれを解決しました。 ComboBox DockPanel.Dock = "Top"を設定し、残りのスペースをListBoxで埋めます。

0
Bill Clyde