我有一个带有我自己的自定义渲染器的Spark列表。当用户滚动列表中的项目时,左侧和右侧按钮出现在行中,允许用户更改正在呈现的值的值。例如,如果有5个优先级(1到5),则左按钮减小值,右按钮增加值。
快速说明:它们不是真正的按钮,而是s:图像设计像按钮一样工作。
现在这个工作正常,除了在一个特定条件下:如果用户选择行,然后将光标移出行,然后返回行,当用户点击任一按钮时,没有任何反应。即使这种情况听起来令人费解,但测试用户仍然会这样做!这对他们来说真的很令人沮丧。
我发现了这种行为的原因:按钮仅显示在项呈示器的悬停和选定状态中。这就是我想要发生的事情 - 按钮不应该是可见的,除非用户的指针能够按下它们。在列表中选择项目时,渲染器的状态将转到选中状态。再次单击不会更改状态。将指针移出行,然后再次返回并单击(在已选择的行上)使行的状态从选定状态变为正常状态(鼠标按下时)并返回到选定状态(在鼠标按下时)。我发现这很奇怪!这意味着按钮实际上在处于正常状态时(它应该)因此没有被点击而消失。
我曾经考虑过,不知何故,我可以在项目渲染器的Z顺序中将图像“更高”,因此它们会在项目渲染器获取之前拦截click事件,但我无法使其工作。
有人可以帮忙吗?
如果有帮助,ItemRenderer的片段如下:
<s:HGroup width="150" verticalAlign="middle" verticalCenter="0">
<s:Image id="previousItemButton" buttonMode="true" source="{_leftArrow}" width="16" height="16" visible.normal="false" visible.hovered="true" visible.selected="true" click="previousClicked(event)"/>
<s:Label text="{data.outputFormat.value}" width="100%" click="nextClicked(event)"/>
<s:Image id="nextItemButton" buttonMode="true" source="{_rightArrow}" width="16" height="16" visible.normal="false" visible.hovered="true" visible.selected="true" click="nextClicked(event)"/>
</s:HGroup>
更新
问题是由构成ItemRenderer的组件的最高级别上的虚假rollOut事件引起的。这个rollOut称为一个方法,包括:
protected function hgroup1_rollOutHandler(event:MouseEvent):void {
if (this.selected) {
this.selected = false;
}
}
这导致问题并删除rollOut并且该方法解决了问题。我不知道为什么在mouseDown上激活转出的原因。