2011-05-19 39 views
2

在Flex 3.0中,我创建了一个具有可拖动窗口(CollapsableTitleWindow代码由其他人编写,但无关紧要)的状态。在Flex中,将属性设置为相对于另一个属性,但然后丢失连接

然后,我创建了一个新的viewstate,它重新定位窗口。

<mx:State name="newstate" basedOn="firststate"> 
    <mx:SetProperty target="{window1}" name="width" value="50%"/> 
    <mx:SetProperty target="{window2}" name="x" value="{window1.width + 5}"/> 

我想在未来的负载到另一位置的一个窗口,但我不希望第二个窗口移动,当用户拖动周围的第一个。

如何在加载时将x绑定到(window1.width + 5)的值,但却失去了对事物的持续评估?

+0

你有没有尝试在'creationComplete'上设置windows'x'值? – 2011-05-19 16:04:01

+0

不,但是creationComplete显然只会引发实际的mx对象。当用户进入新状态时,当我更改window2的属性时,我无法捕捉它。或者我误解了这个?自动完成并不建议它。 – Tominator 2011-05-19 16:38:16

+0

我现在明白了。你只想在状态第一次改变时设置'x',而不是在组件第一次加载时。您可以在事件侦听器中为状态更改事件之一设置'x'属性:** enterState **,** exitState **,** currentStateChange **或** currentStateChanging **。以下是Adobe的文档:http://livedocs.adobe.com/flex/3/html/help.html?content=using_states_3.html。让我知道这是否有效,我会把它写成正式答案。 – 2011-05-19 16:49:34

回答

2

您可以设置在事件监听器,x属性的状态改变的事件之一:enterStateexitStatecurrentStateChangecurrentStateChanging

这是Adobe's documentation

你可以尝试为enterState事件的事件处理程序:

protected function window1_enterStateHandler(event:FlexEvent):void 
{ 
    window1.percentWidth = 100; 
} 

UPDATE: 从下面Tominator的评论:

Alert.show('before: ' + window1.width.toString() + ' pixels, ' + window1.percentWidth.toString() + '%'); 
window1.percentWidth = 50; 
Alert.show('after: ' + window1.width.toString() + ' pixels, ' + window1.percentWidth.toString() + '%'); 

结果是我得到的输出:

之前:458.022705像素,NaN%
后:458.022705像素,50%

你可能想尝试调用window1.validateDisplayList()validateNow()设置percentWidth财产之后。

+0

百分比宽度是一件令人讨厌的事情,这非常不幸。Alert.show('before:'+ window1.width.toString()+'pixels,'+ window1.percentWidth.toString()+'%' ); window1.percentWidth = 50; Alert.show('after:'+ window1.width.toString()+'pixels,'+ window1.percentWidth.toString()+'%');结果是,我得到的输出:458.022705像素,NaN% 之后:458.022705像素,50% – Tominator 2011-05-24 16:15:46

+0

@Tominator我将您的代码示例添加到我的答案。您是否在更新'percentWidth'属性后尝试调用'validateNow'或'validateDisplayList'? – 2011-05-24 16:25:38

+0

非常感谢!我不得不调用validateNow(),因为window1.validateDisplayList()没有做任何事情。现在,我将只使用enterState来处理所有定位声明,当它们相对于其他项目时。 – Tominator 2011-05-25 10:41:36

相关问题