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;
问题原因
- 样式根控件的Align属性限制:自定义样式中
CustomItem_label的根TLayout设置了Align = Center,该对齐方式会强制控件保持样式中定义的固定尺寸(Size.Height=64),忽略外部对ListBoxItem.Height的修改,也不会随内部控件的高度变化而自适应。 - 固定尺寸锁定:根TLayout的
Size.PlatformDefault = False,且明确设置了Height=64,进一步锁定了高度,无法动态调整。 - 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
相关产品推荐
相关产品推荐

