ScrollViewer в расширителе

У меня есть ListBox с расширителями, который, в свою очередь, содержит ListBox. Я хотел бы, чтобы как ListBox с Expanders (listBox1), так и ListBox внутри каждого Expander (listBox2) имели функциональность прокрутки, но я не могу заставить работать самую внутреннюю прокрутку (т.е. scrollViewer1 в моем XAML).

Как я могу заставить работать обе полосы прокрутки?

<ScrollViewer x:Name="scrollViewer1">
   <ListBox x:Name="listBox1" ItemsSource="{Binding Data}">
       <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <Expander>
                        <Expander.Header>
                            <TextBlock Text="{Binding Name}">
                            </TextBlock>
                        </Expander.Header>
                        <ScrollViewer x:Name="scrollViewer2">
                            <ListBox x:Name="listBox2" ItemsSource="{Binding Numbers}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel>
                                            <Grid>
                                                <TextBlock Grid.Column="0" Text="{Binding}"/>
                                            </Grid>
                                        </StackPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                        </ScrollViewer>
                    </Expander>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
   </ListBox>


person aengas    schedule 18.09.2015    source источник


Ответы (1)


Прежде всего, вам не нужны теги scrollviewer: список сам обрабатывает прокрутку. Чтобы управлять видимостью полосы прокрутки списка, вы можете использовать ScrollViewer.HorizontalScrollBarVisibility и ScrollViewer.VerticalScrollBarVisibility.

Во-вторых, вертикальная полоса прокрутки внутреннего списка не отображается, потому что без ограничений по высоте список будет расширяться для отображения всех элементов.

Вот рабочий код, который показывает как полосу прокрутки родительского, так и внутреннего списка:

<Window x:Class="StackOverflow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ListBox x:Name="listBox1" ItemsSource="{Binding Clients}">
        <ListBox.ItemTemplate>
            <DataTemplate>

                <Expander>
                    <Expander.Header>
                        <TextBlock Text="{Binding Name}">
                        </TextBlock>
                    </Expander.Header>

                    <ListBox x:Name="listBox2" ItemsSource="{Binding Children}" MaxHeight="150">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <Grid>
                                        <TextBlock Grid.Column="0" Text="{Binding Name}"/>
                                    </Grid>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

                </Expander>

            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
</Window>

Чтобы воспроизвести проблему, просто удалите MaxHeight во втором списке.

person Bruno    schedule 18.09.2015
comment
Спасибо! Как я могу заставить listBox2 масштабировать его высоту, чтобы соответствовать окну, когда размер окна изменяется? - person aengas; 18.09.2015