【问题标题】:Is it possible to specify individual fonts in Flex DropDownList?是否可以在 Flex DropDownList 中指定单个字体?
【发布时间】:2011-02-08 18:14:57
【问题描述】:

我刚刚实现了一个从 ComboCheck example 中提取的复选框的下拉列表,但它扩展了 DropDownList 而不是 ComboBox 以提供我需要的更好的功能。我正在尝试创建一个DropDownList,其中一些项目是 bold 和非复选框(或可以是复选框),而其他项目则不是。

我还没有在网上找到任何关于这样做的信息,并且一直在试图弄清楚。我目前正在使用ArrayCollection 作为dataProvider,但我认为这可能是我的问题,我应该尝试在 flex 而不是 AS3 中设置标签。

有人知道这是否可能吗?如果是这样,他们是否有任何链接可以帮助我指出正确的方向?

谢谢。

编辑: 为 itemRenderer 添加了代码,这行得通我只需要指定我想要加粗的每个项目,但在 flex 代码中是否有更好的方法来做到这一点,而不是在渲染器中检查匹配的字符串?

public class ComboCheckItemRenderer extends ItemRenderer{  
    public var item:CheckBox;  

    public function ComboCheckItemRenderer(){
        super();
        item = new CheckBox();
        item.x = 5;
        addElement(item);
        item.addEventListener(MouseEvent.CLICK, onClick);
    }

    private var _data:Object;
    [Bindable]override public function set data (value:Object):void {
        if (value!=null) {
            _data = value;
            item.label = value.label;
            if(item.label == "item1"){
                item.setStyle("color","0x00ff00");
                item.setStyle("fontWeight","bold");
            }
            item.selected = value.selected;
        }
    }

编辑 2: 我最终要做的是创建一个复选框下拉列表,其中包含我从 blazeDS 获得的数据,这些数据基本上有一堆组标题及其相应的子元素。我试图让下拉列表使组以粗体和向左显示,并且它们的子元素正常字体并向右偏移。我还需要知道何时单击它们是组标题还是子元素,以便我可以将它们添加到我将发送回我的服务以执行 sql 查询的对象中。 IE。

[ ]**GROUP**  
   [ ] element
   [ ] element
[ ]**GROUP**  
   [ ] element

【问题讨论】:

  • 显示一些代码;你应该没有理由不能创建一个 itemRenderer 来加粗一些项目,而不是其他项目。
  • 我提供了 combocheck 示例的链接,我基本上完全放弃了这个(你可以在那里查看源代码),只是删除了几个我不需要的元素。我不确定还有哪些其他代码有用
  • 虽然我认为这实际上可能正是我所需要的,但我只是能够更改 itemRenderer 中的颜色,所以我知道我可以更改所有内容的样式。虽然这是最好的方法,并且对于我想要粗体的每个元素都有 if 语句?我会在这方面工作一段时间,看看我能否让它正常工作并发布

标签: apache-flex actionscript-3 drop-down-menu flex4


【解决方案1】:

您的数据是什么样的?你为什么不为此使用 MXML?为什么要覆盖 set data() 而不是挂钩 dataChange 事件?您在这里编写的代码比您需要的要多。

让我们以更“灵活”的方式来看待它。请注意我如何对所有内容使用数据绑定,并根据传入的数据有条件地设置fontWeight。任何更复杂的东西都应该在Script 标记中使用函数。

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

    <fx:Script>
        <![CDATA[
            protected function onClick(event:MouseEvent):void {
            }
        ]]>
    </fx:Script>

    <s:CheckBox x="5" click="onClick(event)" 
                label="{data.label}" selected="@{data.selected}" 
                fontWeight="{data.label == 'item1' ? 'bold' : 'normal'}"/>


</s:ItemRenderer>

鉴于您在编辑中添加的问题,我会问:您使用什么标准?您可以在绑定表达式中放置任何函数,因此至少可以执行以下操作:

    <fx:Script>
    <![CDATA[
        private var itemsToBold:Array = ["label1", "label2"];

        private function getFontWeight(label):String {
            if(itemsToBold.indexOf(label) > 0)
                return "bold";

            return "normal";
        }

    ]]>
</fx:Script>

<s:CheckBox fontWeight="{getFontWeight(data.label)}"/>

【讨论】:

  • 感谢您的回复,我会尝试实现这个弹性功能。我自己无法找到一种“灵活”的方式来做这件事,所以我不得不求助于示例动作脚本代码。请查看我的新编辑以了解我的实际最终目标。
  • @Mike:实际上,这与您提出的问题完全不同。我认为您需要 Tree 组件……或者至少创建一个更好地支持该布局的数据结构。我建议将此问题标记为已回答并根据您的新要求开始一个新问题。
  • 一棵树实际上似乎并不是我在查看它之后要寻找的东西,我需要它们作为选择复选框(除非你也可以用树来做到这一点?)。甚至将组标题作为复选框。虽然我会按照回答关闭它,但我能够创建一个适合我需要的解决方案(尽管它可能很丑)
  • 当然,你可以用树来做到这一点。您只需要对其进行蒙皮并适当地设置您的 itemRenderers。
猜你喜欢
  • 2017-05-03
  • 2019-06-17
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2011-06-12
  • 2012-11-03
相关资源
最近更新 更多