Flex第一个窗口宽度/边界被忽略

时间:2011-03-31 18:34:27

标签: flex flex4

我有一个窗口,我想在其中添加/删除组件并根据状态相应地调整窗口大小。但由于某种原因,它忽略了第一次调整大小。 这是一个示例代码

<?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"
                       minWidth="450"
                       minHeight="355"
                       currentState="{stateBox.selected ? 'one' : 'two'}"
                       currentStateChange="handleStateChange(event.oldState, event.newState)">

    <fx:Script>
        <![CDATA[
            private function handleStateChange(oldState:String, newState:String):void 
            {
                if (oldState == "two") {
                    width   -= 341;
                    minWidth    = 450;
                } else {
                    width   += 341;
                    minWidth    = 791;
                }
            }
        ]]>
    </fx:Script>

    <s:states>
        <s:State name="one" />
        <s:State name="two" />
    </s:states>
    <s:Rect id="rect1" top="0" left="0" right="0" right.two="341"  bottom="0" >
        <s:fill>
            <s:SolidColor color="0xDDDDDD" />
        </s:fill>
    </s:Rect>

    <s:Rect id="rect2" top="0" bottom="0" width="341" right="0" includeIn="two" >
        <s:fill>
            <s:SolidColor color="0x000000" />
        </s:fill>
    </s:Rect>

    <s:CheckBox id="stateBox" label="change state" />
</s:WindowedApplication>

想法是当状态变为'2'时,我想添加rect2来显示并增加窗口的minWidth和大小。当状态变为'one'时,我想从显示中删除rect2并调整窗口大小。这似乎有效,除了窗口在第一次状态从“两”变为“一”时不缩小,但之后按预期工作。我不确定为什么它忽略了我第一次减小宽度。我也试过直接更改nativeWindow.bounds,但也没有用。

最初我只是尝试根据状态设置minWidth(minWidth.one =“450 minWidth.two =”791“)但是这导致窗口在左边增长而在右边缩小导致窗口在状态改变时向左移动那么只要状态发生变化,我就会把窗口向右移动,但这会引起一些我不想要的闪烁。

有没有人知道为什么会发生这种情况?或者解决我的问题的好方法?

1 个答案:

答案 0 :(得分:0)

尝试从以下位置翻转这些线条:

                width   -= 341;
                minWidth    = 450;

为:

                minWidth    = 450;
                width   -= 341;

我认为问题在于条件一般设置的方式....我将复制你的代码并修改它我将如何做这个并重新发布作为编辑,但你可以尝试上面的建议(我相信你可能会设置宽度低于最小宽度然后减小minWidth所以首先将宽度的设置设置为根据当前minWidth无效的宽度,认为你由于验证的时间安排,可能只会在第一时间看到这一点。

编辑(编辑两次,通过设置最小和最大高度等于设定高度来添加锁定窗口大小):

<?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"
                       minHeight="355"
                       maxHeight="355"
                       minWidth="450"
                       width.two="791"
                       width.one="450"
                       minWidth.one="450"
                       minWidth.two="791"
                       maxWidth.one="450"
                       maxWidth.two="791">

    <fx:Script>
        <![CDATA[
            protected function stateBox_changeHandler(event:Event):void
            {
                // TODO Auto-generated method stub
                currentState=stateBox.selected ? 'two' : 'one';
            }
        ]]>
    </fx:Script>

    <s:states>
        <s:State name="one"/>
        <s:State name="two"/>
    </s:states>

    <s:HGroup width="100%"
              height="100%"
              gap="0">
        <s:Rect width="450"
                height="100%">
            <s:fill>
                <s:SolidColor color="0xff0000"/>
            </s:fill>
        </s:Rect>

        <s:Rect width="341"
                height="100%"
                includeIn="two">
            <s:fill>
                <s:SolidColor color="0x000000"/>
            </s:fill>
        </s:Rect>
    </s:HGroup>

    <s:CheckBox id="stateBox"
                label="change state"
                change="stateBox_changeHandler(event)"/>
</s:WindowedApplication>

这是否达到了预期的行为^(对不起,我知道我改变了很多代码,但这就是我将如何处理它,也许这不会起作用,因为你需要设置其他明确的大小,但似乎实现了我的目标)