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>
Решение
Мне еще предстоит найти способ восстановить состояние в Flex до значений, представленных в MXML. Вы должны сбросить те значения, которые вам нужны самостоятельно программно. В случае предоставленного примера кода вы можете сбросить высоту приложения при переходе обратно в начальное состояние, добавив следующее в тег WindowedApplication
currentStateChange="if(currentState == 'Start') this.height = 220"
Это говорит тегу WindowedApplication обрабатывать событие, отправленное после изменения текущего состояния, чтобы проверить, является ли новое текущее состояние началом, и установить высоту окна, если оно есть.