在ScrollViewer中自动调整ListBox

时间:2012-12-28 01:43:00

标签: wpf xaml listview user-controls scrollviewer

在我的应用程序中,我有一个Window。它包含左侧菜单,标题和内容的位置。

此内容正在动态加载 - UserControl放在那里。这些UserControls是多种多样的。从TextBlock到非常复杂的页面。为了确保所有内容都可见,我必须用ScrollViewer(我的意思是在MyWindow.xaml中)包装它。一切正常,直到我需要在内容中放置ListView

代码看起来或多或少:

<ScrollViewer> // this is the wrapping viewer actually it's in a different file
    <UserControl>
        ......
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="10*"/>
                <ColumnDefinition Width="20*"/>
            </Grid.ColumnDefinitions>
            <ListView  ItemsSource="{Binding Entities}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Style="{StaticResource Value}" Text="{Binding WorkOrderNumber}"/>
                            <TextBlock Style="{StaticResource Value}" Text="{Binding ActionType}"/>
                            <TextBlock Style="{StaticResource Value}" Text="{Binding StartDate}"/>
                            <TextBlock Style="{StaticResource Value}" Text="{Binding StopDate}"/>
                            <Separator/>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <Whatever.. Grid.Row="0" Grid.Column="1"/>
            <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
                <Button Style="{StaticResource CustomButton}" Content="Previous" />
                <Button Style="{StaticResource CustomButton}" Content="Current" />
                <Button Style="{StaticResource CustomButton}" Content="Next" />
            </StackPanel>
        </Grid>
    </UserControl>
</ScrollViewer>

结果是列表框没有滚动条并且变化很大。滚动条仅在窗口的滚动查看器中。

所以在我想要的UserControl中:

  • 按钮始终位于最底层
  • 列表框以填充整个空间(也与窗口一起调整大小)
  • 避免硬编码列表框的高度

这可能吗?

1 个答案:

答案 0 :(得分:0)

使用DockPanel而不是Grid。 DockPanel有一个名为LastChhildFill的属性。它默认为true。如果将ListBox设置为最后一个Child,它将填充所有空格:

<ScrollViewer>
    <DockPanel>
        <StackPanel DockPanel.Dock="Bottom"
                    Orientation="Horizontal"
                    HorizontalAlignment="Center">
            <Button Style="{StaticResource CustomButton}"
                    Content="Previous" />
            <Button Style="{StaticResource CustomButton}"
                    Content="Current" />
            <Button Style="{StaticResource CustomButton}"
                    Content="Next" />
        </StackPanel>
        <ListView >
        </ListView>
    </DockPanel>
</ScrollViewer>

但是这个设置使按钮消失。我的意思是他们总是在ListBox的底部。所以也许你需要删除ScrollViewer