2011-03-31 83 views
0

我有一個窗口,我想在其中添加/刪除組件,並根據狀態相應調整窗口大小。但由於某種原因,它忽略了第一次調整大小。 這裏是一個示例代碼Flex第一個窗口寬度/邊界被忽略

<?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和窗口的大小。當狀態改變爲'one'時,我想從顯示中刪除rect2並調整窗口大小。這似乎工作,除非窗口在第一次從「兩」到「一」之間的狀態改變時不收縮,而是隨後按預期工作。我不確定爲什麼它忽略了我第一次減小寬度。我也嘗試直接更改nativeWindow.bounds,但這也不起作用。

最初我只是嘗試根據狀態設置minWidth(minWidth.one =「450 minWidth.two =」791「),但導致窗口左側增長和右側縮小,導致窗口隨時向左移動所以然後我只是把窗戶移到右邊,只要狀態改變了,但是導致了一些我不想要的閃爍,

沒有人知道爲什麼會發生這種情況嗎?或者我的問題有很好的解決方案嗎?

+0

你試過調用'validateNow()'或'validateDisplayList ()'調整大小後? – 2011-03-31 19:05:06

+0

是啊我試着調用'validateNow()'和'validateDisplayList()',但它不起作用。奇怪的是,它只是忽略了第一次調用'width - = 341',但隨後的調用工作正常。 – lordofthefobs 2011-03-31 20:09:28

回答

0

嘗試從各地翻轉這些行:

   width -= 341; 
       minWidth = 450; 

到:

   minWidth = 450; 
       width -= 341; 

我認爲這個問題是與該條件是建立在一般的....我要複製您的代碼並修改它,我怎麼會去這樣做,並重新發布的方式一個編輯,但你可以嘗試上面的建議(我相信你可能會設置寬度低於最小寬度,然後減小最小寬度,所以寬度在第一個地方的設置將被設置爲無效的寬度根據目前的minWidth,認爲你可能只會第一次看到這個,因爲驗證的時間。

EDIT(編輯兩次,加上通過設定最低和最高高度等於設定高度鎖定窗口大小):

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

這是否達到所期望的行爲^(抱歉,我知道我改變了很多代碼,但這只是我如何接近它,也許這不會工作,因爲其他明確的大小,你需要設置,但似乎達到我的目標)

+0

嗯,這將是有道理的...我切換了它,但現在它再次成長..這不是我想要的行爲。 我認爲這可能是時間問題,但它發生得如此一致,我不認爲它已經是了。有一些東西阻止第一個寬度集.. – lordofthefobs 2011-03-31 20:15:01

+0

好吧,以及解決這個問題.....但我仍然沒有想要的行爲......我想我可以發表另一個問題。我只需要耐心地增長和縮小窗口並同時設置最小寬度[鏈接](http://stackoverflow.com/questions/5505942/flex-how-can-i-get-window-to- resize-在同一方) – lordofthefobs 2011-03-31 20:31:25

+0

好吧,我想通了。當我增加窗口寬度時,如果我做'寬度+ = 342'而不是341,它修復了一切...... – lordofthefobs 2011-03-31 20:44:53