如何修复全屏的ComboBox下拉问题?

时间:2010-03-11 03:14:41

标签: flex actionscript-3 combobox mxml fullscreen

简短版本:ComboBox的下拉列表可在全屏显示之前正常显示,但不会在期间或之后呈现。

我不完全确定如何问这个,所以我实际上用a page demonstrating the error做了一个非常简单的Flex应用程序,以及你需要自己解决问题的所有三个方向。

对于那些不敢大胆遵循上述链接的人,我会尽力在此解释。我已经构建了一个相当广泛的Flex应用程序(不是链接中的那个),它有一些图形和图表以及这些图表的复选框和其他控件。在一些应用程序状态的应用程序底部,有ComboBox(如HTML中的<select>标记)。因为它位于最底层,当您单击它以访问它的下拉菜单时,Flex会认真地将它从顶部出来。

这在全屏模式下运行良好。进入全屏后,我使用stage.scaleMode = StageScaleMode.SHOW_ALL扩展所有内容。现在,当您点击ComboBox时,下拉列表非常大,实际上落在ComboBox之下,导致它大部分消失在屏幕外。最好的部分是,一旦退出全屏模式,下拉列表仍然会继续低于位于应用底部的ComboBox,因此继续被切断。有没有其他人遇到这只野兽,盯着它看起来很棒,并且胜利了?

您可以从链接中的View Source获取代码,非常感谢您的时间。

2 个答案:

答案 0 :(得分:1)

我对问题的一小部分有一个解决方法,还有一些关于为什么问题的其他部分正在发生的细节。也许其他人可以弄明白其余的。

首先,一般性说明

Flex 3.5 ComboBox使用以下布尔表达式(第1572-73行)来确定是否应将其下拉列表转换为drop up 列表:

point.y + _dropdown.height > screen.bottom && 
point.y > screen.top + _dropdown.height

其中point.y是ComboBox底部的全局坐标。基本上,“如果它会打到底部,而不会击中顶部,那么......”。否则,如果它也会打到顶部,那么它默认回到扔东西正如我们在手边的案例中看到的那样。考虑到这一点......

部分解决方法

当退出全屏模式时,我可以通过将以下代码添加到toggleFullscreen()按钮处理程序退出全屏模式,将应用程序恢复为正常功能:

    ...
    screen.height = height;
    screen.width = width;

    myComboBox.dropdown.invalidateSize(); // myComboBox being the id for the ComboBox
}

解释:发生的一件事(可能是其他因素的影响)是screensystemManager属性的值未正确重置。因此,当评估上面的布尔语句时,它仍然使用全屏值,因此不断将列表放在地板上。此代码只是手动重置屏幕并重新计算下拉列表的大小。

它并不多,但至少它是一些东西。否则...

全屏问题的一些细节

我发现这里有两个问题:

  1. 当在全屏模式下评估上面的布尔表达式时,某些值会缩放,而有些值则不会。即,point.y_dropdown.height是未缩放的,而screen.bottom是缩放的(相对)。因此,表达式的第一部分总是出错,因此ComboBox继续向下渲染列表,即使实际上没有空间。我不知道为什么会发生这种情况,但事实确实如此。我试图间接操纵这些价值而没有不良后果,但我也有一种感觉,即使我得到了正确评价的表达,它也无法解决另一个问题......
  2. 当drop down 列表呈现时,它看起来像是双倍缩放的事实。也就是说,而不是ComboBox在我的显示器上的3.5缩放,下拉列表看起来像是3.5 * 3.5缩放。我没有太多玩这个,但我会说,当我手动应用转换矩阵来缩放ComboBox时,下拉列表的渲染大小看起来与原始匹配(全屏缩放) ) 组合框。也许其他人可以搞砸这个。
  3. 就我而言。我并不完全相信使用变换的解决方案不会去任何地方,但如果编写自己的自定义dropDownFactory将解决问题,我至少会说我很确定它会是不那么乏味。

    祝你好运。

答案 1 :(得分:0)

我在CB的下拉列表中遇到了一些问题,看起来有点无关,但是我必须直接将更改应用到下拉列表myCombo.drowpdown.[insert whatever property],因为它没有将对组合框所做的更改应用于下拉列表。也许你可以在你的应用程序中尝试,看看它是否有帮助。