【发布时间】:2019-06-15 12:39:03
【问题描述】:
我想要一个页眉,然后在下面有一个ScrollViewer 和一个ItemsControl,然后在下面有一个页脚。比如:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid ShowGridLines="True">
<Grid.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="36"/>
</Style>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0">Header</TextBlock>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<ItemsControl>
<ItemsControl.Items>
<TextBlock>Item 1</TextBlock>
<TextBlock>Item 2</TextBlock>
<TextBlock>Item 3</TextBlock>
<TextBlock>Item 4</TextBlock>
<TextBlock>Item 5</TextBlock>
</ItemsControl.Items>
</ItemsControl>
</ScrollViewer>
<TextBlock Grid.Row="2">Footer</TextBlock>
</Grid>
</Window>
上面的差不多就是我想要的了,除了中间那一排是贪心的;即使窗口很高,它也会尽可能多地占用空间,将页脚推到窗口底部。
如果我将中间行的定义更改为Height="Auto",它将完全占用所需的空间量,即使该空间不可用,所以ScrollViewer 永远不会显示滚动条,而页脚将如果窗户不够高,就会从窗户底部迷路。
我如何做到这一点,如果窗口足够高以容纳所有内容,页脚就在 ItemsControl 的下方,但如果窗口不够高,ScrollViewer 会显示一个滚动条,并且页脚位于窗口底部?
我不一定需要使用Grid 执行此操作,但我没有找到任何其他Panel 可以满足我的要求。例如,DockPanel 的标头设置为 DockPanel.Dock="Top",页脚设置为 DockPanel.Dock="Bottom",而填充其余部分的 ItemsControl 的行为方式完全相同。
我尝试过的其他一些东西:
- 在页脚
TextBlock上设置VerticalAlignment="Stretch":没有变化。 - 制作页脚行
Height="*":仍然不是我想要的;页脚和ItemsControl的高度相同,因此页脚在大多数情况下会占用太多空间,或者如果您将窗口设置得非常短,它会超出窗口底部。
【问题讨论】: