【问题标题】:Automatically display a toolTip in an ItemRenderer when the row is visible in the DataGrid当行在 DataGrid 中可见时,自动在 ItemRenderer 中显示工具提示
【发布时间】:2011-01-11 19:03:50
【问题描述】:

我有一个AdvancedDataGrid,它使用HierarchicalData 以树格式显示数据。对于其中一列,如果满足某些条件,我将使用AdvancedDataGridRendererProvider 有条件地显示图像。如果用户将鼠标悬停在图像上,我目前正在使用ToolTipManager 来显示附加信息。

这是我想做的事情:

当用户将鼠标放在图像上时,我不想显示toolTip,而是希望在AdvancedDataGrid 中看到图像时自动显示toolTip。如果用户滚动浏览AdvancedDataGridtoolTip 应随之移动并跟随其图像。

高级数据网格示例:

<mx:AdvancedDataGrid id="myAdvancedDataGrid" 
                        displayItemsExpanded="true"
                        allowMultipleSelection="false"
                        dataProvider="{myTreeData}"
                        draggableColumns="false"
                        depthColors="{[0xD6E5FF,0xFFFFFF]}"
                        folderClosedIcon="{null}" folderOpenIcon="{null}" defaultLeafIcon="{null}">
    <mx:columns>
        <mx:AdvancedDataGridColumn id="colID" headerText="ID" dataField="myID"/>
        <mx:AdvancedDataGridColumn id="colComments" headerText="Comments" dataField="comments"/>
    </mx:columns>
    <mx:rendererProviders>
        <mx:AdvancedDataGridRendererProvider column="{colComments}" depth="2" dataField="comments" renderer="com.whatever.AdvancedDataGridCommentsRenderer" />
    </mx:rendererProviders>
</mx:AdvancedDataGrid>

以及当前的AdvancedDataGridRendererProvider:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" 
         paddingLeft="2" paddingRight="2" paddingTop="2"
         horizontalScrollPolicy="off"
         verticalScrollPolicy="off"
         height="22"
         horizontalAlign="center">
    <fx:Script>
        <![CDATA[
            import mx.controls.ToolTip;
            import mx.events.FlexEvent;
            import mx.managers.ToolTipManager;
            [Embed(source="assets/myImage.png")]
            [Bindable]
            private var myIcon:Class;

            private var commentsToolTip:ToolTip;

            override public function set data(value:Object):void
            {
                super.data = value;
                if (value["comments"] != null)
                {
                    if (value["comments"].toString().length > 0)
                    {
                        myImage.visible = true;
                    }
                    else
                    {
                        myImage.visible = false;
                    }
                }
                else
                {
                    myImage.visible = false;
                }

                validateDisplayList();
            }

            private function showToolTip(evt:Event, text:String):void
            {
                var pt:Point = new Point(evt.currentTarget.x, evt.currentTarget.y);

                // Convert the targets 'local' coordinates to 'global' -- this fixes the
                // tooltips positioning within containers.
                pt = evt.currentTarget.parent.contentToGlobal(pt);

                commentsToolTip = ToolTipManager.createToolTip(text, pt.x, pt.y, "errorTipAbove") as ToolTip;
                commentsToolTip.setStyle("borderColor", "#ff0000");
                commentsToolTip.setStyle("color", "white");
                var yOffset:int =  commentsToolTip.height + 5;
                commentsToolTip.y -= yOffset;
                commentsToolTip.x -= 5;
            }

            // Remove the tooltip
            private function killToolTip():void
            {
                ToolTipManager.destroyToolTip(commentsToolTip);
            }
        ]]>
    </fx:Script>
    <mx:Image id="myImage" 
              source="{myIcon}" 
              mouseOver="showToolTip(event, data['comments'].toString())" 
              mouseOut="killToolTip()" />
</mx:HBox>

有什么建议吗?

【问题讨论】:

    标签: apache-flex actionscript-3 flex4 tooltip advanceddatagrid


    【解决方案1】:

    如果需要在显示图像时始终显示工具提示,那么它并不是您真正需要的工具提示,在这种情况下,您只需向项目渲染器添加一个画布/文本字段。

    例如

    <mx:HBox id="myContainer">
      <mx:Image id="myImage" 
              source="{myIcon}" 
              mouseOver="showToolTip(event, data['comments'].toString())" 
              mouseOut="killToolTip()" />
      <mx:Label text="Some text" />
    </mx:HBox>
    

    然后将对 myImage.visible 的调用设置为 myContainer.visible

    但是,为了快速而肮脏的修复,您已经拥有了所需的一切,只需在 set data override 中进行调用:

            override public function set data(value:Object):void
            {
                super.data = value;
                if (value["comments"] != null)
                {
                    if (value["comments"].toString().length > 0)
                    {
                        myImage.visible = true;
                        showToolTip(<params>);
                    }
                    else
                    {
                        myImage.visible = false;
                        killToolTip(<params>);
                    }
                }
                else
                {
                    myImage.visible = false;
                }
    
                validateDisplayList();
            }
    

    【讨论】:

    • 感谢您的回复!我不同意使用工具提示的想法。如果有更好的方法或组件,我愿意接受。我可能会在您的解决方案中看到的唯一问题是在设置数据时会创建工具提示,但是当用户开始滚动数据网格时会发生什么?行会滚动,但工具提示气泡会保持在它创建的位置,不是吗?
    • 我已经更新了我的答案以包含第一个实现的示例,您可能想要更改它以显示您想要的方式,但它应该让您了解它。如果不测试工具提示是否会移动,我不确定,但我希望你是对的,它不会移动。
    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2017-07-17
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多