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

FireMonkey TListBox运行时修改列表项背景色:非样式方法可行吗?

在FireMonkey中无样式修改TListBox列表项背景色(OnPaint实现)

在FireMonkey框架中,可以不通过样式修改TListBox列表项的行背景色,且完全能通过OnPaint事件实现这个需求,这是跳过样式系统的直接方案之一。

核心实现思路

利用TListBoxItem的OnPaint事件,在事件处理逻辑中先自定义绘制背景区域,再调用父类方法保留原有内容(文字、子控件等)的渲染,以此绕过默认样式的背景绘制逻辑。

具体实现方案

1. 动态创建项的场景(自定义列表项类)

如果你的列表项是动态创建的,可以自定义一个继承自TListBoxItem的类,重写其Paint方法来实现背景色控制:

type
  TCustomListBoxItem = class(TListBoxItem)
  public
    BackgroundColor: TAlphaColor; // 暴露自定义背景色属性
  protected
    procedure Paint; override;
  end;

procedure TCustomListBoxItem.Paint;
var
  ARect: TRectF;
begin
  // 绘制自定义背景
  ARect := ClientRect;
  Canvas.Fill.Color := BackgroundColor;
  Canvas.FillRect(ARect, 0, 0, AllCorners, 1);
  
  // 调用父类方法,保留原有内容(文字、图标等)的绘制
  inherited;
end;

接着将自定义类绑定到TListBox:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.OnCreateItemClass := ListBoxCreateItemClass;
end;

procedure TForm1.ListBoxCreateItemClass(Sender: TObject; var ItemClass: TListBoxItemClass);
begin
  ItemClass := TCustomListBoxItem;
end;

运行时修改某一项的背景色:

var
  TargetItem: TCustomListBoxItem;
begin
  TargetItem := TCustomListBoxItem(ListBox1.Items[0]);
  TargetItem.BackgroundColor := TAlphaColorRec.Orange;
  TargetItem.Repaint; // 触发重绘生效
end;

2. 设计时添加项的场景(直接绑定OnPaint事件)

如果列表项是设计时添加的,无需自定义类,直接给目标TListBoxItem绑定OnPaint事件即可:

procedure TForm1.ListBoxItem1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
begin
  // 绘制背景色
  Canvas.Fill.Color := TAlphaColorRec.LightBlue;
  Canvas.FillRect(ARect, 0, 0, AllCorners, 1);
  
  // 必须调用inherited,否则项的文字、子控件不会显示
  inherited;
end;

关键注意事项

  • 必须保留inherited调用,否则列表项的原有内容(文字、图标、子控件)会被背景覆盖,无法显示。
  • 若需要根据项的状态(选中、悬停)动态切换背景色,可在Paint方法中判断Item.State属性,示例:
    if State = TListItemState.Selected then
      Canvas.Fill.Color := TAlphaColorRec.DarkBlue
    else
      Canvas.Fill.Color := TAlphaColorRec.White;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:25:29