当popUpWidthMatchesAnchorWidth为FALSE时,将下拉列表右对齐

时间:2011-06-15 08:25:00

标签: flex flex4 skinning flex4.5

我为DropDownList“创建”了一个自定义皮肤(即修改了默认的spark.skins.spark.DropDownListSkin)和spark.skins.spark.DropDownListButtonSkin的按钮。

我能够让它几乎完成我想要的所有事情,除了获得下拉的列表以对齐按钮的右侧。在按钮子皮肤中设置<s:PopUpAnchor popUpWidthMatchesAnchorWidth=*false* />允许列表由项目的宽度决定,因为按钮/整个控件的宽度显然远远小于所需的宽度。

以下是现在的样子(默认popUpPosition =“bottom”)

popUpPosition="bottom"

设置popUpPosition =“right”

popUpPosition="right"

这就是我想要的样子

Imagined "bottom right" alignment

所以在这一点上,我要么需要深入研究DropDownList的所有火花源代码,以便更好地理解它是如何工作的,或者这里有人知道如何做到这一点。

任何想法都会受到赞赏。

3 个答案:

答案 0 :(得分:4)

您可以创建一个从PopUpAnchor扩展的自定义PopUpAnchor类,并覆盖其determinePosition函数以修改PopUpPosition.BELOW的行为:

override mx_internal function determinePosition(placement:String,
  popUpWidth:Number, popUpHeight:Number,matrix:Matrix,
  registrationPoint:Point, bounds:Rectangle):void
{
  switch(placement)
  {
    case PopUpPosition.BELOW:
      registrationPoint.x = -popUpWidth + unscaledWidth;
      registrationPoint.y = unscaledHeight;
      break;
    case PopUpPosition.ABOVE:
      registrationPoint.x = 0;
      registrationPoint.y = -popUpHeight;
      break;
    case PopUpPosition.LEFT:
      registrationPoint.x = -popUpWidth;
      registrationPoint.y = 0;
      break;
    case PopUpPosition.RIGHT:
      registrationPoint.x = unscaledWidth;
      registrationPoint.y = 0;
      break;            
    case PopUpPosition.CENTER:
      registrationPoint.x = (unscaledWidth - popUpWidth) / 2;
      registrationPoint.y = (unscaledHeight - popUpHeight) / 2;
      break;            
    case PopUpPosition.TOP_LEFT:
      // already 0,0
      break;
  }
}

设置registrationPoint.x = -popUpWidth + unscaledWidth将其与按钮的右边缘对齐。

DropDownList皮肤中,将PopUpAnchor标记替换为新创建的类,并且应该有一个DropDownList,其行为符合您的要求。

也许有一种更为理智的做法,但我宁愿花时间不知道那是什么。

答案 1 :(得分:1)

PopUpAnchor有一个名为layoutDirection的属性。我相信这就是你要找的东西。 如果您将该属性设置为&#34; rtl&#34;下拉列表将根据需要对齐。

答案 2 :(得分:0)

除了调整popUpWidthMatchesAnchorWidth之外,尝试调整皮肤中的popUpPosition of PopUpAnchor。它可以接受leftright值。更多详情是here