4

当我在 MXML 文件中设置状态时,我时常会遇到错误。我得到的错误说 mx:states 无法解析为组件实现。

我在下面的 url 中读到,这个问题是由扩展组件引起的——这会以某种方式使编译器无法解析 mx:states。我不明白为什么会这样,但我自己没有任何答案。我也不一定能使这种方法适用于我的所有扩展组件。

http://life.neophi.com/danielr/2007/01/could_not_resolve_to_a_compone.html

我想出的解决方法是不使用任何命名空间。因此,我的代码如下所示:

<states>...</states>

而不是:

<mx:states>...</mx:states>

让这个陌生人(至少对我来说)是标签的孩子没有这个问题的事实。mx:states 无法解析,但其子 mx:State 可以。并且 mx:SetProperty - mx:State 的子级 - 也已解决。

任何人都可以解释这一点,和/或提供比我想出的更好的问题解决方案吗?

顺便说一句,我在 mx:transitions 上看到了同样的问题。

4

2 回答 2

17

如果您有一个自定义组件,您可能会将它放在mx以外的命名空间中。通过删除命名空间,您走在了正确的轨道上,但您不必这样做。考虑以下示例

<example:MyComponent xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:example="com.example.*">
</example:MyComponent>

在该代码中,我们在 com.example 包中有一个名为 MyComponent 的自定义组件。现在,我们如何添加自定义状态?这简单!

<example:MyComponent xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:example="com.example.*">

    <example:states>
        <mx:State name="CustomState">
        </mx:State>
    </example:states>

</example:MyComponent>

组件的属性,如statestransitions,甚至Button 上的label都可以创建为子元素。这些属性必须使用与组件实例相同的命名空间。属性来自继承链中的哪个位置并不重要。即使 com.example.MyComponent 扩展了 mx.containers.Canvas, states 属性也将使用定义 MyComponent 的 XML 命名空间。

简而言之,不要将states属性视为mx:states,因为属性的mx:前缀只是从组件继承而来。但是,当我们定义实际状态本身时,我们必须使用mx:,因为那是一个类(不是属性),并且该类是在 mx 命名空间中定义的。

要进一步解释,您可以将http://www.adobe.com/2006/mxml命名空间更改为mx以外的名称。

<zzz:VBox xmlns:zzz="http://www.adobe.com/2006/mxml">
    <zzz:states>
    </zzz:states>
</zzz:VBox>

在该示例中,我们将mx更改为zzz。现在,states属性必须以zzz:而不是mx:为前缀。

于 2008-12-15T20:30:14.557 回答
1
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
         width="100%" 
         height="100%"
         backgroundColor="#f7f7f7" 
         xmlns:common="com.americanexpress.voice.view.component.common.*">
    <mx:states name="edit">

为什么会失败?我还发现,当我定义了多个命名空间时,这会失败。删除<mx:地址问题。

于 2008-12-16T20:58:49.350 回答