2011-08-10 75 views
0

我有一個擴展到NativeWindow的FlexNativeWindow類。 我使用此方法在我的AIR應用程序上創建新窗口。 一切正常,但一些鍵盤交互不可用。Flex 4.5 - 自定義NativeWindow和問題

例如,焦點環繞textinput不可見。 Key Down和Up在DropDownList上不起作用。 TabOrder不能正常工作!

你能解釋爲什麼嗎?因爲我非常失望!

代碼來創建新的窗口

var wdetcorr:wDetailCorrespondant = new wDetailCorrespondant(); 
       wdetcorr.monIdCorresp = correspDG.selectedItem.crIndex; 

       var wOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); 
       wOptions.systemChrome = NativeWindowSystemChrome.NONE; 
       wOptions.transparent = false; 
       var fnwDetailPatient:FlexNativeWindow = new FlexNativeWindow(wdetcorr, wOptions); 
       fnwDetailPatient.active(); 

典約我自定義的NativeWindow

package fr.int.ui.windowSkin 
{ 
    import flash.display.NativeWindow; 
    import flash.display.NativeWindowInitOptions; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.ui.Keyboard; 

    import mx.core.IUIComponent; 
    import mx.core.IVisualElement; 
    import mx.core.IVisualElementContainer; 
    import mx.core.UIComponent; 
    import mx.events.*; 
    import mx.managers.WindowedSystemManager; 

    [Event(name="creationComplete", type="mx.events.FlexEvent")] 

    public class FlexNativeWindow extends NativeWindow implements IFlexNativeWindow 
    { 
     private var _systemManager:WindowedSystemManager; 

     private var _content:UIComponent; 

     private var _window:IVisualElementContainer; 

     public function FlexNativeWindow(window:IVisualElementContainer, initOptions:NativeWindowInitOptions = null) 
     { 
      super(initOptions); 


      _window = window; 

      addEventListener(Event.ACTIVATE, windowActivateHandler); 

     } 

     public function addElement(control:IVisualElement):void 
     { 
      _window.addElement(control); 
     } 

     public function removeElement(control:IVisualElement):void 
     { 
      _window.removeElement(control); 
     } 

     private function windowActivateHandler(event:Event):void 
     { 
      event.preventDefault(); 
      event.stopImmediatePropagation(); 
      removeEventListener(Event.ACTIVATE, windowActivateHandler); 

      if (stage) 
      { 
       if (!_systemManager) 
        _systemManager = new WindowedSystemManager(IUIComponent(_window)); 

       stage.addChild(_systemManager); 

       dispatchEvent(new FlexEvent(FlexEvent.CREATION_COMPLETE)); 

       stage.addEventListener(Event.RESIZE, windowResizeHandler); 
       stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener); 

      } 
     } 

     private function keyDownListener (e:KeyboardEvent):void { 

      if (e.keyCode == Keyboard.ESCAPE) { 
       stage.nativeWindow.dispatchEvent(new Event("myEventClose", true)); 
       stage.nativeWindow.close(); 
      } 


     } 

     private function windowResizeHandler(event:Event):void 
     { 
      // prise en compte de la valeur mini 
      UIComponent(_window).height = stage.stageHeight; 
      UIComponent(_window).width = stage.stageWidth; 


     } 
    } 
} 
+0

添加自己的WindowedSystemManager(並將其添加到舞臺)的目的是什麼?我認爲這可能會干擾Flex創建的那個。 –

回答

0

你應該FlexNativeWindow實施IFocusManagerContainer固定焦點問題。

這裏是如何做到這一點在Flash Builder:

  1. Ctrl + Shift + T和類型IFocusManagerContainer
  2. 打開相應的文件
  3. 實現在類的所有聲明的方法FlexNativeWindow

PS :但是,這種方法可能會失敗,因爲flex組件應放置在flex容器中,而NativeWindow是本地類,不是Flex SDK類。我建議你使用Flex容器的Window類,它已經實現了IFocusManagerContainer

+0

感謝您的回答。因爲我是初學者,你可以向我解釋如何修改FlexNativeWindow類/ Thanks – Flex60460

+0

感謝您的回答。我這樣做,你解釋,但只有與得到並設置DefaultButton。 – Flex60460

+0

感謝您的回答。我這樣做,你解釋,但只有與得到並設置DefaultButton。是否需要實施所有已聲明的方法。其他問題,我使用NativeWindow,因爲我使用空氣,對我來說使用本機窗口選項非常重要。所以如果可以用窗戶進行銷售,我會很高興知道如何。謝謝 – Flex60460