Как фокус работает во Flex? - PullRequest
       3

Как фокус работает во Flex?

5 голосов
/ 17 февраля 2011

Я пытаюсь выяснить, как работает механизм фокусировки во Flex. Вот пример того, что я имею в виду:

Предположим, что у нас есть простое веб-приложение, которое содержит пользовательский компонент, расширяющий Canvas и реализующий mx.managers.IFocusManagerComponent. Этот компонент переопределяет методы focusInHandler и focusOutHandler и показывает некоторую обратную связь о том, как они называются (более тонкая или более толстая граница). Этот пользовательский компонент также содержит некоторые Text.

Источник компонента:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100" height="100" creationComplete="cc();" implements="mx.managers.IFocusManagerComponent">
<mx:Script>
    <![CDATA[
        import mx.containers.Canvas;
        import mx.controls.Text;
        import mx.controls.TextArea;
        import mx.core.UIComponent;
        import mx.managers.IFocusManagerComponent;

        public function cc():void
        {
            text = new Text;
            text.text = "123";
            addChild(text);

            setStyle("backgroundColor", "0xddddff");
            setStyle("borderColor", "0x000000");
            setStyle("borderThickness", 1);
            setStyle("borderStyle", "solid");
        }

        private var text:Text;

        override protected function focusInHandler(e:FocusEvent):void {
            trace("focusInHandler, currFocus: " + focusManager.getFocus());
            setStyle("borderThickness", 4);
        }

        override protected function focusOutHandler(e:FocusEvent):void {
            trace("focusOutHandler, currFocus: " + focusManager.getFocus());
            setStyle("borderThickness", 1);
        }
    ]]>
</mx:Script>
</mx:Canvas>

Вот текущая версия (с видом на источник): http://rafalrybacki.com/lab/focus_question/. В приложении также есть TextArea под Canvas - для облегчения манипуляции фокусировкой при тестировании.

Вопросы:

  1. Если вы щелкнете один раз на фиолетовом холсте, он получит фокус (вызывается focusInHandler), затем, если вы нажмете еще раз, фокус потеряется (focusOutHandler вызывается) - почему? 1031 *

  2. Если вы нажмете на Text, Canvas получает фокус (focusInHandler вызывается) и удерживает его при нажатии в любом месте области (focusOutHandler nevet вызывается) - почему?

Может быть, мое понимание всей проблемы фокусировки неверно? Спасибо за любые предложения.

С уважением,

Рафал

1 Ответ

1 голос
/ 19 февраля 2011

Привет, Рафалрыбакы. [Я нахожусь на собрании и не могу тратить время на вопрос, но подумал, что могу помочь с указателем или двумя:]

Во-первых, целью Canvas является взаимодействие с FocusManager иначе, чем с компонентом, который реализует IFocusManagerComponent. Canvas реализует IFocusManagerContainer, и хотя вы можете выполнить то, что пытаетесь достичь, превратив контейнер в IFocusManagerComponent, я бы избегал этого просто потому, что пытался делать то, что, как мне кажется, команда flex sdk предназначала при использовании внутренних компонентов.

Я думаю, они хотели бы, чтобы вы прослушали FocusEvent в вашем контейнере. По умолчанию FocusEvents всплывает, поэтому вы можете выполнить практически все, что вам нужно, с помощью простого прослушивателя событий.

Примечание. Прослушивание focusOut может привести к путанице с компонентами, которые имеют несколько uicomponents в качестве дочерних элементов, т. Е. Combobox имеет UITextField и Button, поэтому у компонента есть несколько событий FocusOut и FocusIn, происходящих из одного и того же компонента. Ваш спаситель будет (я бы догадался) делать container.contains () для элемента focusManger.getFocus () (приведение его и т. Д.), Чтобы точно установить ваш стиль.

Я просто болтаю, так что если вам нужна некоторая помощь помимо этого, или вы хотели бы узнать больше о том, почему focusIn или focusOut evt отправляются, когда они отправляются - я был бы рад объединить некоторый код для Вы и объясните, почему тип события ловится. Лучше всего сделать это (чтобы соответствовать рекомендациям по Flex SDK) - использовать прослушиватель событий из контейнера, а не бороться с компонентом, который одновременно является IFocusManagerComponent И IFocusManagerContainer. Может запутаться.

Надеюсь, это поможет. Удачи, Джереми

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...