如何将Genlist设置为仅显示模式并移除列表项边框
解决EFL Genlist仅显示模式下移除列表项边框的问题
我之前也踩过这个坑!EFL里Genlist的外观控制有时候会和主题绑定得很深,光靠选择模式的API确实不一定能完全去掉边框——毕竟ELM_OBJECT_SELECT_MODE_NONE只是禁用了选择交互,主题样式可能还在硬渲染边框或者默认的项容器样式。给你几个亲测有效的方案:
方案1:直接修改列表项的Evas对象属性
创建完每个Genlist项后,获取它对应的Evas对象,强制把边框设为0,同时再确认一遍选择和高亮模式:
// 创建Genlist项 Elm_Object_Item *item = elm_genlist_item_append(genlist, NULL, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); // 获取项的Evas对象 Evas_Object *item_obj = elm_object_item_object_get(item); // 强制设置边框为0 evas_object_border_set(item_obj, 0); // 再次确认选择模式和高亮模式 elm_object_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_NONE); elm_genlist_highlight_mode_set(genlist, ELM_GENLIST_HIGHLIGHT_MODE_NONE);
这个方法直接操作底层Evas对象,绕过主题的部分样式控制,大部分情况下都能生效。
方案2:使用主题自带的无边框样式
Elementary的默认主题里有一些预定义的无边框项样式,你可以直接给列表项指定:
elm_genlist_item_style_set(item, "text_only_noborder");
不同的主题可能样式名称不一样,如果这个不行,试试"none"或者"basic_noborder"——你可以查一下当前主题的Edje文件里定义的Genlist项样式。
方案3:自定义主题样式(终极解决方案)
如果上面的方法都不管用,说明主题的样式优先级很高,这时候可以用自定义CSS片段覆盖:
- 新建一个CSS文件(比如
genlist_custom.css),内容如下:
.genlist .item { border-width: 0px; background-color: transparent; padding: 0px; /* 可选:如果项有默认内边距也可以去掉 */ }
- 在你的代码里加载这个自定义样式:
Elm_Theme *theme = elm_theme_get(); elm_theme_extension_add(theme, NULL, "./genlist_custom.css");
这个方法能彻底覆盖主题的默认样式,适合需要完全自定义外观的场景。
为啥你之前的方法没生效?简单说:ELM_OBJECT_SELECT_MODE_NONE只是关掉了选择的交互逻辑,但主题还是会渲染项的默认容器样式(包括边框);elm_genlist_highlight_mode_set控制的是高亮触发的时机(比如悬停/点击),并不是直接移除边框元素。所以必须从Evas对象属性或者主题样式层面入手才能彻底去掉边框。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

