Flex截断按钮标签

时间:2009-02-06 02:51:45

标签: flex

首先,我为这个问题的含糊不清道歉。在这一点上,我只是想尝试一些新的想法,以便诊断这个bug。

无论如何,我遇到的问题是使用自定义模块加载器的应用程序。该模块加载器已编译为swc,并且模块加载器正在通过其命名空间进行实例化。一切都很好。我遇到的问题特定于mx:模块中使用的按钮控件。无论出于何种原因,他们的标签被截断,例如,登录显示省略号,如Sign ...

经过相当多的愚弄,我已经能够建立以下内容:

  1. 这个问题似乎只发生在模块中。如果在主mxml中使用了按钮控件,则标签不会被截断。
  2. 标签被截断的按钮控件没有指定宽度(将其宽度设置为100%或特定像素宽度无法解决问题)
  3. 按钮控件使用默认填充(通过左右设置为5来填充填充或任何其他值也无济于事。)
  4. 我们没有使用任何嵌入字体,所以我也认为这是一种可能性。
  5. mx:CheckBox和mx:LinkBut​​ton同样受到这个问题的影响,虽然mx:CheckBox似乎也不想显示它的复选框,它只显示截断的标签。
  6. 这可能产生的副作用是将数据提供者附加到mx:ComboBox会导致组合框控件抛出绘图错误,但我并不完全确定它与上述问题有关。

    我在阅读网络时找到的一个有趣的事情就是提到了fontContext及其与IFlexModuleFactory的关系。在我们的moduleloader实现中没有对fontContext的规范,所以我不完全确定这是否是问题所在。无论如何,如果有人有任何想法,那将非常感激。另一方面,如果你确切地知道我的痛苦并能给我一个答案,我可能会兴奋地弄湿自己。晚了。我累了。我需要我的Flex应用程序才能玩得很好。

    提前致谢,

    - 安

    编辑:为了澄清我正在寻找的这个问题,我真的需要了解以下内容:

    1. 此问题可能是由命名空间冲突引起的吗?
    2. 如果没有实现CSS,还有什么可能会覆盖标签的默认行为?
    3. 在使用moduleloader的自定义实现时,是否有人遇到继承丢失的问题?
    4. 是否有人在使用或不使用moduleloader时遇到此问题或类似问题?
    5. 我没有与这个问题共享任何代码只是因为我必须共享整个应用程序,不幸的是,我不能这样做。再一次,我不是在寻找最终目标,是所有解决方案,只是提出了一些建议,如果有人有任何想法需要注意。

4 个答案:

答案 0 :(得分:5)

我一直在处理这个问题,一次又一次地以各种形式处理这个问题一年,虽然我还没有弄清楚究竟是什么导致了这个问题,但显然在某个地方发生了错误的测量。 / p>

我能够做到的是解决它,主要是通过子类化按钮类型控件(在我的例子中,Button,LinkBut​​ton,PopUpButton等等)并为它们的textField成员分配UITextField的实例。扩展,其truncateToFit元素在所有情况下都返回false:

public class NonTruncatingUITextField extends UITextField
{
    public function NonTruncatingUITextField ()
    {
        super();
    }

    override public function truncateToFit(s:String = null):Boolean
    {
        return false;
    }
}

自定义组件只是扩展Button(或者其他任何按钮类型控件都是罪魁祸首 - 我自己创建了大约6个左右,每种类型的控件都有一个)但是使用了{{1作为其标签,由组件用户指定:

NonTruncatingTextField

...所以最后,在你的MXML代码中,你会引用自定义组件(在这种情况下,我告诉控件永远不要截断它的标签):

public class NonTruncatingButton extends Button
{
    private var _truncateLabel:Boolean;

    public function NonTruncatingButton()
    {
        super();

        this._truncateLabel = true;
    }

    override protected function createChildren():void
    {
        if (!textField)
        {
            if (!_truncateLabel)
                textField = new NonTruncatingUITextField();
            else
                textField = new UITextField();

            textField.styleName = this;

            addChild(DisplayObject(textField));
        }

        super.createChildren();
    }

    [Inspectable]
    public function get truncateLabel():Boolean
    {
        return this._truncateLabel;
    }

    public function set truncateLabel(value:Boolean):void
    {
        this._truncateLabel = value;    
    }   
}

我同意这感觉就像一个解决方法,组件架构应该更优雅地处理所有这些,并且它可能是我们都忽略的东西,但它的工作原理;希望它能够在您寻找更明确的解决方案时解决您的问题。 (虽然就个人而言,我现在正在使用它,我已经转向了其他事情 - 时间更好地花在别处!)

祝你好运 - 让我知道它是如何运作的。

答案 1 :(得分:0)

我使用了自定义按钮和链接按钮类解决方案,但仍然遇到了问题 - 但是找到了一个每次都适用于我的解决方法。

创建一个css样式,其中包含您要用于标签的字体。请务必在文本选择下拉列表中选中“嵌入此字体”。返回并将样式应用到您的按钮(或您的自定义按钮,具体取决于您对这个特定墙壁进行抨击的时间长度),瞧!

或者应该瞧...

答案 2 :(得分:0)

通过将labelPlacement设置为“bottom”,我已经成功阻止了Flex错误的按钮标签截断,如:

theButton.labelPlacement = ButtonLabelPlacement.BOTTOM;

设置标签放置似乎不会有助于防止在某些更宽的按钮尺寸中截断,但在许多情况下它对我有用。

如果您无法使用底部对齐的按钮标签(例如,当您的按钮具有水平对齐的图标时),janusz的方法似乎也有效。这是一个使用ActionScript而不是MXML的janusz .text重新分配技术的版本:

theButton.addEventListener(FlexEvent.UPDATE_COMPLETE, function (e:FlexEvent):void {
  e.target.mx_internal::getTextField().text = e.target.label;
});

前面的代码要求您首先导入mx_internal和FlexEvent,如下所示:   import mx.events.FlexEvent;   import mx.core.mx_internal;

以下是结果......

之前(注意尽管有足够的水平空间但是截断):

enter image description here

后:

enter image description here

这种方法的唯一缺点是你丢失了省略号,但就我而言,我认为这是一个受欢迎的功能。

答案 3 :(得分:0)

我刚遇到这个问题并以这种方式解决:

<mx:LinkButton label="Some label"
    updateComplete="event.target.mx_internal::getTextField().text = event.target.label"
/>;