You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:17:20