WPF中RowDefinition实际高度低于阈值时设为0实现折叠效果
解决方案
要实现Grid中非首行在窗口缩小时自动折叠(高度设为0)、放大时恢复的效果,可通过监听Grid的尺寸变化事件,动态调整RowDefinition的高度属性来实现,具体步骤如下:
1. 初始化RowDefinition时保存原始高度设置
创建非首行的RowDefinition时,先定义并保存它们的初始高度规则(比如Auto或Star),同时设置最小高度作为折叠阈值:
Dim NewGridSchalter As New System.Windows.Controls.Grid Dim newRow1 As New RowDefinition Dim newRow2 As New RowDefinition Dim newRow3 As New RowDefinition ' 首行保持最小高度30,确保始终可读 newRow1.MinHeight = 30 ' 定义并保存非首行的原始高度设置(这里以Auto为例,可按需改为Star) Dim originalRow2Height As GridLength = New GridLength(1, GridUnitType.Auto) Dim originalRow3Height As GridLength = New GridLength(1, GridUnitType.Auto) newRow2.Height = originalRow2Height newRow3.Height = originalRow3Height ' 给非首行设置最小高度30,作为判断是否折叠的阈值 newRow2.MinHeight = 30 newRow3.MinHeight = 30 NewGridSchalter.RowDefinitions.Add(newRow1) NewGridSchalter.RowDefinitions.Add(newRow2) NewGridSchalter.RowDefinitions.Add(newRow3) Dim NewColumnBild As New ColumnDefinition Dim NewColumnText As New ColumnDefinition NewGridSchalter.ColumnDefinitions.Add(NewColumnBild) NewGridSchalter.ColumnDefinitions.Add(NewColumnText) NewGridSchalter.ShowGridLines = False NewGridSchalter.HorizontalAlignment = HorizontalAlignment.Stretch NewGridSchalter.VerticalAlignment = VerticalAlignment.Stretch
2. 添加Grid尺寸变化监听事件
给Grid绑定SizeChanged事件,在事件处理逻辑中根据可用空间动态调整行高:
' 绑定尺寸变化事件 AddHandler NewGridSchalter.SizeChanged, AddressOf Grid_SizeChanged ' 事件处理方法 Private Sub Grid_SizeChanged(sender As Object, e As SizeChangedEventArgs) Dim targetGrid As Grid = CType(sender, Grid) If targetGrid Is Nothing Then Return ' 计算首行实际占用高度 Dim firstRowActualHeight As Double = targetGrid.RowDefinitions(0).ActualHeight ' 计算Grid剩余可用高度 Dim remainingAvailableHeight As Double = targetGrid.ActualHeight - firstRowActualHeight ' 非首行总共需要的最小高度(每行30px) Dim totalRequiredMinHeight As Double = 30 * (targetGrid.RowDefinitions.Count - 1) If remainingAvailableHeight < totalRequiredMinHeight Then ' 剩余空间不足以容纳所有非首行的最小高度,折叠这些行 For i As Integer = 1 To targetGrid.RowDefinitions.Count - 1 targetGrid.RowDefinitions(i).Height = New GridLength(0) Next Else ' 空间足够,恢复非首行的原始高度设置 targetGrid.RowDefinitions(1).Height = originalRow2Height targetGrid.RowDefinitions(2).Height = originalRow3Height End If End Sub
补充说明
- 非首行的原始高度可按需调整:如果希望行高随Grid剩余空间按比例分配,可将
GridUnitType.Auto改为GridUnitType.Star;如果是固定高度,直接设置具体数值即可。 - 循环处理非首行的逻辑可适配更多行的场景,无需单独修改每一行代码。
- 通过判断剩余空间是否满足所有非首行的最小高度总和,确保首行始终可读,其他行在空间不足时自动隐藏。
内容的提问来源于stack exchange,提问作者Roli
相关产品推荐
相关产品推荐

