Flex 4.5 - Пользовательские NativeWindow и проблемы - PullRequest
0 голосов
/ 10 августа 2011

У меня есть класс FlexNativeWindow, который распространяется на NativeWindow. Я использую этот метод для создания нового окна в приложении AIR. Все работает хорошо, но некоторое взаимодействие с клавиатурой недоступно.

Для примера, фокус ввода текста не виден. Клавиши вниз и вверх не работают на 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;


        }
    }
}

1 Ответ

0 голосов
/ 10 августа 2011

Вы должны внедрить IFocusManagerContainer в FlexNativeWindow для устранения проблем с фокусировкой.

Вот как это сделать в Flash Builder:

  1. Нажмите Ctrl + Shift + T и введитев IFocusManagerContainer
  2. Открыть соответствующий файл
  3. Реализовать все объявленные методы в вашем классе FlexNativeWindow

PS: Однако этот подход может потерпеть неудачу, поскольку гибкие компоненты должны бытьпомещается в контейнер Flex, в то время как NativeWindow является собственным классом, а не классом Flex SDK.Я предлагаю вам использовать Window класс, который является контейнером Flex и уже реализует IFocusManagerContainer.

...