【问题标题】:How can I access a component within <fx:Declarations> in an MXML class?如何在 MXML 类中访问 <fx:Declarations> 中的组件?
【发布时间】:2011-12-20 18:24:59
【问题描述】:

是否可以在 MXML 类中将声明的组件作为 IFactory 访问?我已经多次为 Skin Parts 使用这种声明工厂的方式,但我从未弄清楚如何从 MXML 中访问这些工厂。

这是我期望的工作示例:

<fx:Declarations>
    <fx:Component id="labelDisplay">
        <s:Label fontSize="12" fontWeight="bold"/>
    </fx:Component>
</fx:Declarations>

<fx:Script>
    <![CDATA[
        override protected function createChildren():void
        {
            super.createChildren();

            var label1:Label = labelDisplay.newInstance();
            addElement(label1);

            var label2:Label = labelDisplay.newInstance();
            addElement(label2);

            var label3:Label = labelDisplay.newInstance();
            addElement(label3);
        }
    ]]>
</fx:Script>

* 编辑 *

我希望上述代码能够工作的原因是基于 Spark 蒙皮架构中处理动态皮肤部件的方式。如果上面的代码是 MXML 外观类的一部分,那么在我的宿主组件中,我可以有以下内容。

[SkinPart(required="true",type="spark.controls.Label")]
public var labelDisplay:IFactory;

在 Spark 蒙皮架构中, 什么时候变成 IFactory?

【问题讨论】:

    标签: apache-flex flex4 mxml


    【解决方案1】:

    我研究了 Flex 的 SkinnableComponent 以根据他们如何将 MXML 外观与 AS HostComponent 绑定来找到解决方案。显然,即使“labelDisplay”没有作为具体类成员出现在 FlashBuilder 的自动完成中,您仍然可以将其作为动态属性引用。我在这里修改了我原来的例子:

    <fx:Declarations>
        <fx:Component id="labelDisplay">
            <s:Label fontSize="12" fontWeight="bold"/>
        </fx:Component>
    </fx:Declarations>
    
    <fx:Script>
        <![CDATA[
            override protected function createChildren():void
            {
                super.createChildren();
    
                var labelFactory:ClassFactory = this["labelDisplay"];
    
                var label1:Label = labelFactory.newInstance();
                addElement(label1);
    
                var label2:Label = labelFactory.newInstance();
                addElement(label2);
    
                var label3:Label = labelFactory.newInstance();
                addElement(label3);
            }
        ]]>
    </fx:Script>
    

    【讨论】:

      【解决方案2】:

      我看到的问题是您没有创建 iFactory,因此无法访问 iFactory 方法。

      如果需要,我会建议您进入 ActionScript 并实际创建一个 iFactory。这使用ClassFactory

      protected var labelDisplay: iFactory = new ClassFactory(spark.controls.Label);
      

      那么您的 createChildren 代码应该可以正常工作。

      【讨论】:

      • 我只是将其与上述 MXML 是皮肤时如何解释代码进行比较。如果是这种情况,那么在我的主机组件中,我可以拥有以下内容(如下)。在 Spark 蒙皮架构中, 在什么时候变成了 IFactory? '[SkinPart(required="true",type="spark.controls.Label")]' 'public var labelDisplay:IFactory;'
      • SkinPart 是组件的可视部分;并且 IFactory 不是视觉作品;它是一个创建其他类的类。即使您正在创建皮肤;我仍然会在 ActionScript 中定义 IFactory。如果要在组件类中定义 IFactory;您可以使用 hostComponent 属性从外观类访问它。如果您想了解更多信息,请深入了解 List 类和 ListSkin 代码。
      • 我看到我正在尝试做的事情似乎是不正确的。在这里简单地在 AS 中创建一个 IFactory 并在 AS 中使用它会更清楚。但是,我想要从我的 IFactory 中得到一个完全自定义的标签,其中已经填写了字体、大小、颜色和定位信息。使用 MXML 声明所有这些内容要容易得多。
      • @Jeff 你没有理由不能创建一个自定义标签组件,并填写好字体、大小、颜色和定位信息;然后将该新组件用作 ClassFactory 创建的类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多