0

我需要能够在禁用的复选框上显示工具提示。我在 stackoverflow 和其他地方看到的一个解决方案是将复选框包装在一个组中并为组提供工具提示。这行得通,但我正在尝试一般地执行此操作。

我希望能够在自定义复选框组件上设置一个属性,然后将复选框包装在一个设置了工具提示的组中。

我的问题是,我不知道如何在运行时在 Checkbox ActionScript 代码中将 Checkbox 添加到 Group 组件。我已经尝试将 showDisabledToolTip 属性添加到 Checkbox 类,并且在设置时执行以下操作:

var parent = this.parent;
    var gp:Group = new Group();
    gp.toolTip = this.toolTip;
    gp.addElement(this);
    if(parent is Group) {
        parent.addElement(gp);
    } else {
        parent.addChild(gp);
    }

那时我的主要问题是 this.parent 为空。除此之外,我什至不知道这是否真的有效。

帮助表示赞赏。谢谢!

4

1 回答 1

0

我想出了扩展 CheckBox 类并创建一个新的 CheckBoxSkin 的解决方案,其中包含 2 个新的 SkinStates(disabledWithTooltip 和 disabledWithTooltipSelected)

扩展的 Checkbox 类添加了一个新的 disabledWithTooltip 属性并覆盖了 getCurrentSkinState 方法和来自 ButtonBase 的 mouseEventHandler

自定义 CheckBox 类


package components
{

    import flash.events.Event;
    import flash.events.MouseEvent;

    import mx.events.FlexEvent;

    import spark.components.CheckBox;

    [SkinState (disabledWithToolTip)]
    [SkinState (disabledWithToolTipSelected)]

    public class CustomCheckBox extends CheckBox
    {
        private var _disabledKeepToolTip:Boolean = false;

        public function CustomCheckBox()
        {
            super();
            this.addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete, false, 0, true);
        }

        protected function onCreationComplete(ev:FlexEvent):void {
            //_storedState = this.currentState;
        }


        protected override function getCurrentSkinState():String {
            if(!_disabledKeepToolTip)
                return super.getCurrentSkinState();
            else {
                if(!selected)
                    return "disabledWithToolTip";
                else 
                    return "disabledWithToolTipSelected";
            }
        }

        protected override function mouseEventHandler(event:Event):void {
            var skinState:String = getCurrentSkinState();

            if(skinState != "disabledWithToolTip" && skinState != "disabledWithToolTipSelected") {
                super.mouseEventHandler(event);
            }
        }
        [Bindable]
        [Inspectable(category="General", enumeration="true,false", defaultValue="true")]
        public function get disabledKeepToolTip():Boolean {
            return _disabledKeepToolTip;
        }

        public function set disabledKeepToolTip(value:Boolean):void {

            _disabledKeepToolTip = value;

            this.invalidateSkinState();
        }

    }
}

基于(spark)CheckBoxSkin 创建一个新的 Skin 并更改元数据中的主机组件

[HostComponent("components.CustomCheckBox")]

并添加两个新的 skinStates

<s:State name="disabledWithToolTip" stateGroups="disabledStates" />
<s:State name="disabledWithToolTipSelected" stateGroups="disabledStates, selectedStates" />

用法例如

<s:HGroup>
    <components:CustomCheckBox id="custom_chk" label="KeepTooltipCheckbox" skinClass="skins.CustomCheckBoxSkin" toolTip="See this tooltip"/>
    <s:CheckBox id="enable_chk" label="enable/disable" change="{custom_chk.disabledKeepToolTip = enable_chk.selected}"/>
</s:HGroup>

如果不同,您必须调整自己的包结构......

于 2013-03-01T10:59:52.497 回答