Flex - возврат окна в исходное состояние

Я рву волосы вот уже неделю или около того, пора обратиться за помощью ...

Я кодирую небольшое приложение, чтобы показать мне, как следующий поезд отправляется со станции. Обычно отображается только час следующего поезда, но если вы нажмете кнопку «Prefs», окно приложения увеличится и отобразится сетка данных с поездами и часами. Нажатие на кнопку закрытия в этом состоянии возвращает вас в состояние «старт» или должно это сделать.

Проблема в том, что сетка данных исчезает, но окно приложения остается прежнего размера. Он должен вернуться к своему первоначальному размеру.

Я пробовал много разных подходов, заменяя VBox на Canvas или Panels, но ни один из них не работал. В режиме дизайна при переключении между состояниями все работает должным образом.

Я впервые использую состояния, поэтому, возможно, мне не хватает чего-то фундаментального.

Вот пример кода - я использую 2 состояния просмотра, Start и Prefs.

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
creationComplete="init();" 
cornerRadius="12"
currentState='Start' width="350" height="250">
<mx:states>
    <mx:State name="Start">
        <mx:AddChild>
            <mx:VBox id="box_parent" width="100%" height="100%" verticalGap="2">
                <mx:Label text="Next Train Leaves At" textAlign="center" width="100%"/>
                <mx:Label text="--:--" width="100%" height="100" fontSize="64" id="timetext" textAlign="center" fontWeight="bold"/> 
                <mx:HBox width="100%" height="25" id="hbox1">
                    <mx:Button label="Prefs"
                        id="buttonPrefs"
                        click="currentState='Prefs'"/>
                    <mx:Spacer width="70%" id="spacer1"/>
                    <mx:Button 
                        label="Next"
                        click="findNextTrain()" id="buttonNext"/>   
                </mx:HBox>      
            </mx:VBox>      
        </mx:AddChild>
        <mx:SetProperty name="layout" value="vertical"/>
        <mx:SetProperty name="width" value="350"/>
        <mx:SetProperty name="height" value="220"/>
    </mx:State>
    <mx:State name="Prefs" basedOn="Start">
        <mx:AddChild relativeTo="{box_parent}" position="lastChild">
            <mx:DataGrid height="80%" width="100%" dataProvider="{trains}" id="traindata" editable="false">
                <mx:columns>
                    <mx:DataGridColumn headerText="Station" dataField="stationid"/>
                    <mx:DataGridColumn headerText="Leave" dataField="leave"/>
                </mx:columns>
            </mx:DataGrid>
        </mx:AddChild>
        <mx:RemoveChild target="{buttonPrefs}"/>
        <mx:SetProperty target="{box_parent}" name="height" value="500"/>
        <mx:AddChild relativeTo="{spacer1}" position="before">
            <mx:Button label="Close" click="currentState='Start'"/>
        </mx:AddChild>
        <mx:SetProperty name="height" value="570"/>
    </mx:State>
</mx:states>

<mx:transitions> 
    <mx:Transition fromState="*" toState="*"> 
        <mx:Resize target="{this}" duration="500"/> 
    </mx:Transition> 
</mx:transitions> 
</mx:WindowedApplication>

person Alex Boschmans    schedule 16.06.2009    source источник


Ответы (1)


Мне еще предстоит найти способ сбросить состояние Flex до значений, указанных в MXML. Вы должны программно сбросить, какие значения вам нужны. В случае предоставленного примера кода вы можете сбросить высоту приложения при возврате в начальное состояние, добавив следующее в тег WindowedApplication

currentStateChange="if(currentState == 'Start') this.height = 220"

Это указывает тегу WindowedApplication обрабатывать событие, отправленное после изменения текущего состояния, чтобы проверить, является ли новое текущее состояние Start, и установить высоту окна, если это так.

person Brandon Bodnar    schedule 16.06.2009
comment
Спасибо! Это помогло. Это означает, что при необходимости я также могу сбросить значения с помощью ActionScript. - person Alex Boschmans; 17.06.2009
comment
Да, конечно, если вам нужно проделать большую работу по сбросу состояния представления, я бы посоветовал переместить его в функцию и иметь событие, вызывающее функцию при отправке. - person Brandon Bodnar; 17.06.2009