Гибкое первое окно ширины / границы игнорируется - PullRequest
0 голосов
/ 31 марта 2011

У меня есть окно, в которое я хочу добавить / удалить компонент и изменить его размер в зависимости от состояния.но по какой-то причине он игнорирует первое изменение размера.Вот пример кода

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

Идея состоит в том, что когда состояние меняется на 'два', я хочу добавить rect2 для отображения и увеличения minWidth и размера окна.И когда состояние меняется на «один», я хочу удалить rect2 с дисплея и изменить размер окна.Кажется, это работает, за исключением того, что окно не сжимается в первый раз, когда состояние изменяется с «двух» на «один», но впоследствии работает, как ожидается.Я не уверен, почему он игнорирует первый раз, когда я уменьшаю ширину.Я также попытался изменить nativeWindow.bounds напрямую, но это тоже не сработало.

Первоначально я только что попытался установить minWidth в зависимости от состояния (minWidth.one = "450 minWidth.two =" 791 "), но это привело к тому, что окно увеличивалось влево и уменьшалось вправо, в результате чего окно перемещалось влево при каждомсостояние менялось, поэтому я просто перемещал окно вправо, когда состояние менялось, но это вызывало какое-то мерцание, которого я не хотел.

Кто-нибудь знает, почему это может происходить? или хорошее решение длямоя проблема?

1 Ответ

0 голосов
/ 01 апреля 2011

Попробуйте перевернуть эти строки с:

                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>

Достигает ли это желаемого поведения ^ (извините, я знаю, что я изменил много кода, но я просто подхожу к этому, может быть, это не сработает из-за других явных размеров, которые вам нужно установить, но, кажется, для достижения цель для меня)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...