【问题标题】:Hide a Button in a ButtonBar在 ButtonBar 中隐藏按钮
【发布时间】:2013-08-27 21:51:46
【问题描述】:

我想知道是否有任何方法可以隐藏 ButtonBar 中的特定按钮。根据这个答案(以及第二个答案中提供的链接)Disable individual buttons in a buttonbar 我需要使用 ButtonBar 的 getChildAt 方法,但是当我这样做时,我得到了自定义皮肤对象而不是 Button 对象。我想知道如何访问 Button 对象。

谢谢!

【问题讨论】:

  • 您使用的是 MX ButtonBar 还是 Spark ButtonBar?如果 Spark,您链接到的答案不适用。不过,这个概念是一样的。找到按钮并切换其可见性。或者,可能,从 ButtonBar 的 dataProvider 中删除该按钮,而无需切换按钮上的单个可见性。
  • 哦,我没想到,你说得对,它是 Spark。我需要切换可见性,因为删除按钮会弄乱一堆其他组件所依赖的索引(它非常紧密耦合:()

标签: actionscript-3 apache-flex


【解决方案1】:

假设您的按钮栏中的所有按钮将同时呈现并且您不需要滚动条...

使用 Spark ButtonBar,您可以直接访问皮肤部分以访问按钮。概念上是这样的:

var button : Button = mySparkButtonBarInstance.dataGroup.getElementAt(SomeIndex);
button.visible = false; // or true
button.includeInLayout = false;  // or true

如果您的 ButtonBar 可以使用虚拟布局并且需要滚动,这将不起作用。


编辑:这是演示此技术的工作代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Script>
        <![CDATA[
            import mx.core.IVisualElement;
            protected function button1_clickHandler(event:MouseEvent):void
            {
                trace(buttonBar.dataGroup.getElementAt(0));
                var button :IVisualElement = buttonBar.dataGroup.getElementAt(0);
                button.visible = false; // or true
                button.includeInLayout = false;  // or true         }
            }
        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:layout>
        <s:VerticalLayout paddingLeft="20" paddingTop="20"/>
    </s:layout>

    <s:ButtonBar id="buttonBar">  
        <mx:ArrayCollection>
            <fx:String>Flash</fx:String> 
            <fx:String>Director</fx:String> 
            <fx:String>Dreamweaver</fx:String> 
            <fx:String>ColdFusion</fx:String> 
        </mx:ArrayCollection>
    </s:ButtonBar>

    <s:Button label="Remove" click="button1_clickHandler(event)" />

</s:WindowedApplication>

【讨论】:

  • 我今天对此进行了测试并遇到了一些问题:任何想法为什么 .dataGroup.getElementAt(SomeIndex) 即使 numElements (和 getItemIndicesInView)返回正确的数量也总是返回 null ?从 dataProvider 中删除元素是可行的,但更改 .visible 或几乎其他任何东西似乎都没有做任何事情。
  • 如果我不得不猜测这是一个转换问题。您是否尝试将其转换为按钮? mySparkButtonBarInstance.dataGroup.getElementAt(SomeIndex) as Button
  • 是的。始终为空。 dataProvider 是一个 ArrayCollection,如果这有什么不同,我添加了带有 for (var i:int=0; i &lt; 10; i++){ var button:Button = new Button(); button.label = "btn"+i.toString(); ac.addItem(button);} 的按钮。 (对不起,如果有一些错别字,我现在不在那台电脑上)
  • 我添加了一个完整的工作示例来演示这种方法。基本上,getElementAt() 返回一个 ButtonSkin;不是 Button,因此转换将为空。
  • 好的,这就解释了。来自我的 +1
猜你喜欢
  • 2019-04-14
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多