如何在禁用的控件上显示工具提示?

9

我正在显示一个按钮列表,其中一些可能被禁用。我需要在禁用的按钮上显示一个工具提示,解释为什么它被禁用,但似乎我不能禁用按钮而不禁用工具提示。有没有简单的方法解决这个问题?


我正在使用spark.components.Button类。 - geo
5个回答

15

将按钮包装在一个组中,然后将工具提示应用于该组而不是按钮本身。

<s:Group toolTip="My toolTip">
    <s:Button enabled="false"/>
</s:Group>

虽然有点丑,但它有效。


1
一种方法是重写 enabled 的 getter 和 setter 方法以实现所需功能。在我的情况下,我仍希望大多数鼠标事件触发,只是不希望点击事件触发。
<?xml version="1.0" encoding="utf-8"?>
<s:Button buttonMode="true" click="handleClick(event)" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Script>
        <![CDATA[
            public var data:Object;
            private var _enabled:Boolean = true;

            public override function get enabled():Boolean
            {
                return _enabled;
            }

            public override function set enabled(value:Boolean):void
            {
                _enabled = value;
                invalidateDisplayList();
                dispatchEvent(new Event("enabledChanged"));
                invalidateSkinState();
            }

            protected function handleClick(event:MouseEvent):void
            {
                if (!_enabled)
                {
                    event.stopPropagation();
                }
            }
        ]]>
    </fx:Script>
</s:Button>

自从鼠标事件重新触发后,工具提示再次起作用。

0
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
        import mx.managers.ToolTipManager;
        import mx.controls.ToolTip;
        private var tooltip:ToolTip;
        private var p:Point;

        private function whyDisable():void
        {

            //calculate the button position , so that roll over shows the tooltip 
            p=new Point();
            p=localToGlobal(new Point(btn.x,btn.y));
            if(btn.enabled==false)
                tooltip = ToolTipManager.createToolTip('Button is disabled',p.x+(btn.width/2),p.y-20,'errorTipAbove') as ToolTip;
            else
                tooltip=ToolTipManager.createToolTip('Button is enabled',p.x+(btn.width/2),p.y-20,'errorTipAbove') as ToolTip;
        }
        ]]>
    </mx:Script>
    <mx:VBox height="100%" width="100%" horizontalAlign="center" verticalAlign="middle">
        <mx:Button id="btn" label="Show Tooltip" buttonDown="trace('ankur')" autoRepeat="true" enabled="true" rollOver="whyDisable();" rollOut="{ToolTipManager.destroyToolTip(tooltip);}"/>
    </mx:VBox>
</mx:Application>

你好,这个应用程序可以在禁用的按钮上工作,我使用了ToolTipManager来实现这一点,

希望这对你有用

祝你玩得愉快

Ankur Sharma


谢谢提供的示例,不幸的是我正在使用spark.components.Button类,当enabled设置为false时,它会将mouseEnabled和mouseChildren设置为false。这意味着我无法使用rollover事件。 - geo

0
对我来说最好的选择是在元素周围和前面放置一个空标签。然后,如果必要,我将元素设置为禁用状态,工具提示将在标签中起作用。如果不需要,我就把标签发送到后面。这个方法非常有效。
if (new MainListsAdmin(this.mainApp).temInvestimentoComAqueleTipo(t)) {
            deletarGroupInto.setTooltip(new Tooltip("Há investimentos vinculados a Tipo de Investimento.\nDeleção bloqueada."));
            this.deletarButton.setDisable(true);
}else{
        deletarGroupInto.toBack();
}

-1

我曾考虑在我的解决方案中使用ToolTipManager,但这很困难,因为Spark按钮在禁用时不会分派鼠标事件,所以我必须使用另一种方法来检测用户何时悬停在按钮上。我发现的最简单的解决方案是在禁用的按钮上方简单地创建额外的不可见按钮,并使用它们内置的工具提示行为。并不理想,我知道。 - geo
您说得对,尽管文档中明确表示Spark按钮在禁用时会引发鼠标事件,但实际上并非如此。除非您正在进行某些奇怪的皮肤定制,不然您能否使用Halo按钮作为替代品呢?我已经向Adobe关于Spark按钮文档的问题报告了一个bug。 - Sly_cardinal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接