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

Delphi FMX ListBox自定义样式项无法修改高度的问题求助

Delphi FMX自定义ListBoxItem无法修改高度的原因及解决方法

我开发了一个简单的Delphi FMX应用,已添加以下三种自定义ListBoxItem样式:

object TStyleContainer
  object TLayout
    StyleName = 'CustomItem_edit'
    Align = Center
    Padding.Left = 3.000000000000000000
    Padding.Top = 3.000000000000000000
    Padding.Right = 3.000000000000000000
    Padding.Bottom = 3.000000000000000000
    Size.Width = 296.000000000000000000
    Size.Height = 64.000000000000000000
    Size.PlatformDefault = False
    Visible = False
    TabOrder = 2
    object TText
      StyleName = 'text'
      Align = Top
      HitTest = False
      Position.X = 3.000000000000000000
      Position.Y = 3.000000000000000000
      Size.Width = 290.000000000000000000
      Size.Height = 17.000000000000000000
      Size.PlatformDefault = False
      TextSettings.FontColor = xFF909090
      TextSettings.WordWrap = False
      TextSettings.HorzAlign = Leading
    end
    object TEdit
      StyleName = 'Edit1'
      Touch.InteractiveGestures = [LongTap, DoubleTap]
      Align = Top
      TabOrder = 0
      Position.X = 3.000000000000000000
      Position.Y = 20.000000000000000000
      Size.Width = 290.000000000000000000
      Size.Height = 21.000000000000000000
      Size.PlatformDefault = False
    end
  end
  object TLayout
    StyleName = 'CustomItem_list'
    Align = Center
    Padding.Left = 3.000000000000000000
    Padding.Top = 3.000000000000000000
    Padding.Right = 3.000000000000000000
    Padding.Bottom = 3.000000000000000000
    Size.Width = 296.000000000000000000
    Size.Height = 64.000000000000000000
    Size.PlatformDefault = False
    Visible = False
    TabOrder = 0
    object TText
      StyleName = 'text'
      Align = Top
      HitTest = False
      Position.X = 3.000000000000000000
      Position.Y = 3.000000000000000000
      Size.Width = 290.000000000000000000
      Size.Height = 17.000000000000000000
      Size.PlatformDefault = False
      TextSettings.FontColor = xFF909090
      TextSettings.WordWrap = False
      TextSettings.HorzAlign = Leading
    end
    object TComboBox
      StyleName = 'ComboBox1'
      Align = Top
      Position.X = 3.000000000000000000
      Position.Y = 20.000000000000000000
      Size.Width = 290.000000000000000000
      Size.Height = 22.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 0
    end
  end
  object TLayout
    StyleName = 'CustomItem_label'
    Align = Center
    Padding.Left = 3.000000000000000000
    Padding.Top = 3.000000000000000000
    Padding.Right = 3.000000000000000000
    Padding.Bottom = 3.000000000000000000
    Size.Width = 296.000000000000000000
    Size.Height = 64.000000000000000000
    Size.PlatformDefault = False
    Visible = False
    TabOrder = 1
    object TText
      StyleName = 'text'
      Align = Top
      HitTest = False
      Position.X = 3.000000000000000000
      Position.Y = 3.000000000000000000
      Size.Width = 290.000000000000000000
      Size.Height = 17.000000000000000000
      Size.PlatformDefault = False
      Text = 'Text'
      TextSettings.FontColor = xFF909090
      TextSettings.WordWrap = False
      TextSettings.HorzAlign = Leading
    end
    object TLabel
      StyleName = 'Label1'
      Align = Top
      Position.X = 3.000000000000000000
      Position.Y = 20.000000000000000000
      Size.Width = 290.000000000000000000
      Size.Height = 17.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 0
    end
  end
end

目前可以正常向ListBox添加CustomItem_label类型的项:

item := TListBoxItem.Create(nil);
item.Parent := ListBox1;
item.StyleLookup := 'CustomItem_label';
item.StylesData['text'] := '标题';
item.StylesData['Label1.Text'] := '内容';

但无法修改单个ListBoxItem的高度(期望能根据Label1的内容/高度自适应),尝试了以下几种方法均无效:

  • 直接设置高度:
item.Height := 1000;
  • 通过StylesData修改样式高度:
item.StylesData['CustomItem_label.Height'] := 1000;
  • 修改StyleBook中的样式资源:
obj := StyleBook1.Style.FindStyleResource('CustomItem_label');
if (obj is TLayout) then begin
  TLayout(obj).Height := 1000;
end;

问题原因

  1. 样式根控件的Align属性限制:自定义样式中CustomItem_label的根TLayout设置了Align = Center,该对齐方式会强制控件保持样式中定义的固定尺寸(Size.Height=64),忽略外部对ListBoxItem.Height的修改,也不会随内部控件的高度变化而自适应。
  2. 固定尺寸锁定:根TLayout的Size.PlatformDefault = False,且明确设置了Height=64,进一步锁定了高度,无法动态调整。
  3. ListBox的统一高度限制:ListBox默认会使用统一的ItemHeight值(默认非0),强制所有Item保持相同高度,即使单个Item的高度被修改也不会生效。

解决方法

1. 修改自定义样式的根布局属性

将CustomItem_label的根TLayout的Align改为Client,并允许尺寸动态调整,同时给Label1开启自动换行:

object TLayout
  StyleName = 'CustomItem_label'
  Align = Client  // 改为Client,填充ListBoxItem的空间
  Padding.Left = 3.000000000000000000
  Padding.Top = 3.000000000000000000
  Padding.Right = 3.000000000000000000
  Padding.Bottom = 3.000000000000000000
  Size.Width = 296.000000000000000000
  Size.Height = 64.000000000000000000
  Size.PlatformDefault = True  // 改为True,允许动态调整高度
  Visible = False
  TabOrder = 1
  object TText
    StyleName = 'text'
    Align = Top
    HitTest = False
    Position.X = 3.000000000000000000
    Position.Y = 3.000000000000000000
    Size.Width = 290.000000000000000000
    Size.Height = 17.000000000000000000
    Size.PlatformDefault = False
    Text = 'Text'
    TextSettings.FontColor = xFF909090
    TextSettings.WordWrap = False
    TextSettings.HorzAlign = Leading
  end
  object TLabel
    StyleName = 'Label1'
    Align = Top
    Position.X = 3.000000000000000000
    Position.Y = 20.000000000000000000
    Size.Width = 290.000000000000000000
    Size.Height = 17.000000000000000000
    Size.PlatformDefault = True
    TextSettings.WordWrap = True  // 开启自动换行,让Label根据内容调整高度
    TabOrder = 0
  end
end

2. 取消ListBox的统一ItemHeight限制

在代码中设置ListBox的ItemHeight为0,让它根据每个Item的实际高度渲染:

ListBox1.ItemAppearance.ItemHeight := 0;

3. 正确设置单个Item高度(或自适应)

修改样式后,直接设置Item高度会生效,或者让Label内容自动换行后,Item会自适应高度:

item := TListBoxItem.Create(nil);
item.Parent := ListBox1;
item.StyleLookup := 'CustomItem_label';
item.StylesData['text'] := '多行内容测试';
item.StylesData['Label1.Text'] := '这是一段较长的测试文本,用于验证Label自动换行和Item高度自适应的效果,文本内容越多,Label的高度会自动增加,Item也会跟着调整高度。';
// 手动设置高度也会生效:
// item.Height := 150;

内容的提问来源于stack exchange,提问作者BxOO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:42:02