【问题标题】:Flex first window width/bound gets ignoredFlex的第一个窗口宽度/边界被忽略
【发布时间】:2011-07-27 03:38:34
【问题描述】:

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

<?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>

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

最初我只是尝试根据状态设置 minWidth (minWidth.one="450 minWidth.two="791") 但这会导致窗口在左侧增长并在右侧收缩,从而导致窗口在状态发生变化时向左移动. 所以我只是在状态改变时将窗口向右移动,但这会导致一些我不想要的闪烁。

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

【问题讨论】:

  • 调整大小后是否尝试调用validateNow()validateDisplayList()
  • 是的,我尝试同时调用validateNow()validateDisplayList(),但它不起作用。奇怪的是,它只忽略了对width -= 341 的第一次调用,但后续调用工作正常。

标签: apache-flex flex4


【解决方案1】:

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

                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>

这是否实现了预期的行为 ^(对不起,我知道我更改了很多代码,但这就是我将要处理的方法,也许这不会起作用,因为您需要设置其他显式大小,但似乎可以实现我的目标)

【讨论】:

  • 嗯嗯,这很有意义......我改变了它,但现在它又开始增长了......这不是我想要的行为。我认为这也可能是时间问题..但它发生得如此频繁,以至于我认为它不再是了。有东西挡住了第一个宽度集..
  • 好吧,这很好地回答了这个问题......但我仍然没有想要的行为......我想我可以发布另一个问题。我只需要 abel 可以同时增大和缩小窗口并设置 minwidth link
  • 好的,我想通了。当我增加窗口宽度时,如果我使用width += 342 而不是 341,它会修复所有问题...
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2014-02-19
相关资源
最近更新 更多