【发布时间】:2016-10-15 02:34:46
【问题描述】:
背景
我需要一个具有以下布局属性的网格:
- 4 行:页眉、主要内容、子内容、页脚
- 标题是静态内容,不会真正受到调整大小的影响
- 主要内容需要填满所有可用空间,最小高度为 180
- 子内容是可以收缩和增长的RTB。该子内容会占用一些主要内容空间,但应始终为主要内容留出 180 像素。理想情况下,子内容应该只占用它需要的最小区域。如果网格中没有多少空间,RTB 应该停止增长,而是启用其内部滚动查看器。
- 页脚类似于页眉,静态内容不受调整大小的影响
问题
子内容 (RTB) 不会自动调整大小以适应剩余空间,也不会启用垂直滚动条。这会导致主要内容下方的任何内容都剪辑到窗口之外。
问题
如何让RichTextBox 缩小以显示页脚,允许用户滚动浏览隐藏的RichTextBox 内容,同时在用户拉伸窗口时允许RichTextBox 展开?
您将在下面找到一个 SSCCE,它展示了我正在努力实现的目标以及它导致的问题:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
MinWidth="200" MinHeight="300" Width="200" Height="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*" MinHeight="180"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="Header" HorizontalAlignment="Center"/>
<Rectangle Grid.Row="1" Fill="Red"/>
<RichTextBox Grid.Row="2"
VerticalScrollBarVisibility="Visible"
Height="Auto"
Margin="0,5,0,0"
VerticalAlignment="Stretch"
BorderBrush="#FF818181"
BorderThickness="0.5"
Background="#FFEEEEEE"
FontSize="14">
<FlowDocument>
<List>
<ListItem>
<Paragraph>Lorem</Paragraph>
<Paragraph>IpSum</Paragraph>
<Paragraph>Lorem</Paragraph>
<Paragraph>IpSum</Paragraph>
</ListItem>
</List>
</FlowDocument>
</RichTextBox>
<TextBlock Grid.Row="3" Text="Footer" HorizontalAlignment="Center"/>
</Grid>
</Window>
这是窗口最小尺寸时的图像:
这是窗口被拉伸以显示全部时的图像:
额外信息
我知道如果我将子内容RowDefinition 设置为*,那么RichTextBox 工作正常,除了,因为当窗口展开时它占用了太多空间。我需要这个区域占用与Auto 一样多的空间,同时表现得像*。
【问题讨论】:
-
行定义 1 和 2 都需要是 ` * `,但使用百分比(分别像 7* 和 3*)来调用 RTB 中的嵌入式 ScrollViewer。这也应该缓解页脚隐藏问题。您只需要确定要显示的每个百分比(尽管显然保持最小高度值)。
-
我目前正在使用 8* 和 3*,直到我有更好的解决方案,但根据屏幕尺寸,3* 大于或小于首选尺寸。大屏幕上的基本子内容有很多空白空间可供主内容使用,而复杂的子内容则被限制在一个区域内,而不是使用未使用的主内容空间。
-
听起来比描述的更形象化,因为我无法描绘意图与结果。我可能只合并高度的最小值和最大值以获得所需的结果。
-
作为标准,主要内容应该占据大部分空间,但有时,选定的项目可能有很多内容要放入 RichTextBox。在这种情况下,最好有一个更大的子内容区域以避免滚动文本。然而,当屏幕空间有限时,主要内容需要最小尺寸才能生效,这意味着 RichTextBox 应该适合带有滚动条的小区域。在大屏幕空间中,我不希望 RichTextBox 占用太多它不使用的空间。
标签: c# wpf xaml layout expression-blend