Как изменить порядок вкладок в Flex (Actionscript, SDK 3.5)

Гибкий порядок вкладок важен как для удобства использования (очевидно), так и для доступности (он определяет порядок чтения программ чтения с экрана). Однако Flex 3.5, похоже, почти не имеет поддержки, чтобы повлиять на него для более сложных приложений.

Из того, что я знаю до сих пор:

  • порядок вкладок рассчитывается mx.managers.FocusManager, который заботится об одном. «цикл вкладок» для всего приложения (т.е. не для каждого контейнера, а для всего приложения). Исключением являются встроенные файлы .swf и всплывающие окна, каждое из которых имеет собственный FocusManager.

  • логика внутри FocusManager помечена как закрытая, а экземпляр класса создается в Application.initialize (), поэтому изменить поведение (если не считать перезаписи частей SDK, что может вызвать проблемы с лицензией)

  • Порядок табуляции ищет для каждого компонента свойство tabIndex (int). Все компоненты, для которых установлено это свойство (> 0), упорядочиваются по его значению, в противном случае используется визуальная иерархия (которая использует вложенность контейнеров и дочерний порядок внутри контейнеров).

  • Все компоненты без tabIndex сортируются после компонентов, для которых он установлен (внутренне «tabIndex not set» сопоставляется с «tabIndex = int.MAX_VALUE»)

  • два компонента с одинаковым tabIndex упорядочиваются по визуальной иерархии .

Это означает, что вы можете либо использовать автоматическое упорядочение по визуальной иерархии (в основном то, что вам нужно), либо вы можете использовать указание tabIndexes напрямую - НО, если вы сделаете это, вы полностью испортите автоматический порядок. Это особенно плохо, если вы работаете с пользовательскими компонентами и хотите изменить порядок вкладок внутри них: как только вы это сделаете, вы нарушите порядок вкладок для всех экранов, использующих ваш компонент. Также вы не можете просто установить порядок табуляции только в mxml-файле самого высокого уровня, так как часто у вас нет доступа к внутренней работе используемых вами компонентов.

Пример:

accVerticalStuff.mxml

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Label text="One"/>
    <mx:TextInput tabIndex="1" id="One" />

    <mx:Label text="Two" />
    <mx:TextInput tabIndex="2" id="Two"/>

    <mx:Label text="Three" />
    <mx:TextInput tabIndex="3" id="Three"/>

</mx:VBox>

Приложение. mxml

Ожидаемый результат: порядок табуляции будет следующим: сначала три вертикальных элемента слева, затем три вертикальных элемента справа, т. Е. Сгруппированные по контейнерам. TopLevelElement - первый в порядке табуляции. (это работает точно так же, если tabIndex не указан, однако тогда мы не можем активировать изменение tabIndex, например, переключить One и Three по тем или иным причинам, по которым мы могли бы это сделать)

Фактический результат: порядок табуляции горизонтальный, то есть переход между двумя формами ввода. Элемент TopLevelElement (без указания tabIndex) стоит последним в порядке табуляции.

Изменение вложения контейнеров не будет работать в модульных проектах, а изменение порядка дочерних элементов повлияет на их положение отображения (тогда как переход на контейнер Canvas теряет AutoLayout).

Есть ли способ (возможно, сложный, но желательно без переписывания SDK) указать порядок табуляции для отдельных компонентов, независимо от других компонентов?

если ничего не помогает, может ли обновление до Flex4 помочь в решении этой проблемы?

5
задан www0z0k 14 December 2010 в 08:40
поделиться