Apache flex Flex截断按钮标签

Apache flex Flex截断按钮标签,apache-flex,Apache Flex,首先,我对这个问题的含糊不清表示歉意。在这一点上,我只是想尝试一些新的想法来诊断这个bug 无论如何,我遇到的问题是一个使用自定义moduleloader的应用程序。该moduleloader已编译成swc,并且正在通过其命名空间实例化moduleloader。这一切都很好。我遇到的问题特定于模块中使用的mx:button控件。不管出于什么原因,他们的标签被截断了,所以,例如,登录显示为省略号,如Sign 经过相当一段时间的胡闹,我已经能够确定以下几点: 这个问题似乎只发生在模块内。如果在主mx

首先,我对这个问题的含糊不清表示歉意。在这一点上,我只是想尝试一些新的想法来诊断这个bug

无论如何,我遇到的问题是一个使用自定义moduleloader的应用程序。该moduleloader已编译成swc,并且正在通过其命名空间实例化moduleloader。这一切都很好。我遇到的问题特定于模块中使用的mx:button控件。不管出于什么原因,他们的标签被截断了,所以,例如,登录显示为省略号,如Sign

经过相当一段时间的胡闹,我已经能够确定以下几点:

  • 这个问题似乎只发生在模块内。如果在主mxml中使用按钮控件,则标签不会被截断
  • 标签被截断的按钮控件没有指定宽度(将其宽度设置为100%或特定像素宽度无法解决此问题)
  • 按钮控件使用默认的填充(通过将left和right设置为5或任何其他值来混淆填充也没有帮助)
  • 我们没有使用任何嵌入式字体,所以我也排除了这种可能性
  • mx:CheckBox和mx:LinkButton同样受到此问题的影响,尽管mx:CheckBox似乎也不想显示其复选框,但它只显示截断的标签
  • 这样做的一个潜在的副作用是,将数据提供程序附加到mx:ComboBox会导致ComboBox控件抛出一个绘图错误,但我不能完全确定它是否与上述问题有关

    我在网上搜索答案时发现了一件有趣的事情,那就是提到了fontContext及其与IFlexModuleFactory的关系。我们的moduleloader实现中没有fontContext的规范,所以我不能完全确定这是否是问题所在。无论如何,如果有人有任何想法,我们将不胜感激。另一方面,如果你确切地知道我的烦恼并能给我一个答案,我可能会兴奋得浑身湿透。很晚了。我累了。我需要我的Flex应用程序玩得很好

    提前感谢,

    --安妮

    编辑:为了澄清我想问的问题,我只需要知道以下几点:

  • 此问题是否由命名空间冲突引起
  • 如果没有实现CSS,还有什么可能覆盖标签的默认行为
  • 是否有人在使用moduleloader的自定义实现时遇到继承丢失的问题
  • 是否有人在使用或不使用moduleloader时遇到过此问题或类似问题

  • 我不会与这个问题共享任何代码,因为我必须共享整个应用程序,不幸的是,我不能这样做。再说一次,我不是在寻找最终的解决方案,只是一些建议,如果有人有任何想法的话,我需要注意。

    一年来,我一直在断断续续地以各种形式处理这个问题,虽然我还没有弄清楚是什么导致了它,很明显,在这条线路的某个地方发生了误判

    不过,我能够解决的是,基本上是通过对按钮类型控件(在我的例子中是button、LinkButton、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(或者任何其他按钮类型控件都是罪魁祸首——我自己创建了六个左右的按钮类型,每种类型的控件一个),但使用
    非RuncatingTextField
    作为其标签,其中由组件用户指定:

    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;    
        }   
    }
    
    。。。最后,在MXML代码中,您将引用自定义组件(在本例中,我告诉控件永远不要截断其标签):

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


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

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

    创建一个css样式,其中包含要用于标签的字体。确保选中文本选择下拉列表下的“嵌入此字体”。返回并将该样式应用于您的按钮(或自定义按钮,具体取决于您在墙上敲击耳朵的时间),瞧


    或者应该是这样的…

    通过将labelPlacement设置为“底部”,我已经成功地防止了Flex错误的按钮标签截断,如下所示:

    设置标签位置似乎无助于防止更大尺寸的按钮被截断,但在许多情况下,它对我来说是有效的

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

    theButton.addEventListener(FlexEvent.UPDATE_COMPLETE, function (e:FlexEvent):void {
      e.target.mx_internal::getTextField().text = e.target.label;
    });
    
    前面的代码要求您首先导入mx_internal和FlexEvent,如下所示: 导入mx.events.FlexEvent; 导入mx.core.mx_internal

    下面是结果

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

    之后:


    这种方法的唯一缺点是省略号丢失,但在我的例子中,我认为这是一个受欢迎的特性。

    我刚刚遇到了这个问题,并通过以下方式解决了它:

    <mx:LinkButton label="Some label"
        updateComplete="event.target.mx_internal::getTextField().text = event.target.label"
    />;
    
    您是
    theButton.addEventListener(FlexEvent.UPDATE_COMPLETE, function (e:FlexEvent):void {
      e.target.mx_internal::getTextField().text = e.target.label;
    });
    
    <mx:LinkButton label="Some label"
        updateComplete="event.target.mx_internal::getTextField().text = event.target.label"
    />;