在之前的文章虚幻ComboBoxString控件样式设置说明末尾有提到,“下拉框会有个固定底色挡住MenuBorderBrush,也就是很多网友都遇到的无法设置下拉框背景的问题。”针对这个问题,我当时在网上找了很多资料,得到的结论是官方就是这样设计的,要看后续引擎是否会调整。我做了调研,可以通过修改引擎源码将下拉列表固定底色修改为透明色来解决。不过,当时只处理了下拉列表的固定底色问题,没有解决Menu背景色问题,所以目前MenuBorderBrush仅适合设置矩形不透明图片。
接下来就将我当时的调研过程与结论整理出来,做个分享。
引擎版本:UE5.3.2
一、背景色组成分析
1.先将MenuBorderPadding设置成50
下拉框表现如下(灰色椭圆是我设置的选中项图片,可忽略):
为便于观察,修改引擎源码中对应颜色值,可以看出背景由三个部分组成:
继续将三个颜色值都改成透明,再给MenuBorderBrush设置一张半透明图片,理想效果如下:
二、引擎源码分析
2.1 Menu描边和背景
1.颜色定义
定义颜色值
将颜色枚举值设置给结构体FStyleColors的成员变量
2.定义笔刷 "Menu.Background" "Menu.Outline"
3.SMenuContentWrapper中使用笔刷
4.SMenuContentWrapper调用分析
SMenuContentWrapper构造函数的调用堆栈SComboButton继承SMenuAnchor,展开下拉框时调用SMenuAnchor::SetIsOpen()
FMenuStack::WrapContent()里实例化MenuStackInternal::SMenuContentWrapper
2.2 List背景
1.颜色定义(同Menu)2.定义笔刷 "ListView"
3.SListView中使用笔刷
4.SListView调用分析
SListView构造函数调用堆栈三、解决
三、解决方案
在2.2点的第3点可以看到,SListView类中_ListViewStyle有个默认值。
那我就在SComboBox类中实例化SListView的时候,手动传入一个无色(透明)的样式,即可解决下拉列表固定底色问题。
如下图所示: