Поле со списком немедленно закрывается при нажатии на определенные области выпадающей кнопки

#apache-flex #flex4

#apache-flex #flex4

Вопрос:

У меня есть поле со списком Spark, которое автоматически закрывает всплывающую область при нажатии на определенные области значка открытого выпадающего списка. Рядом с этим всплывающим окном находится поле со списком, которое работает отлично.

Первое всплывающее окно — это список шрифтов. Второй — это список размеров шрифта.

Я заметил, что в поле со списком шрифтов начались проблемы, когда я заполнил его списком системных шрифтов. В массиве 900 шрифтов. До этого список шрифтов был заполнен 10 шрифтами. Он отлично работает с 10 шрифтами.

Поле со списком шрифтов находится в выноске, но это, похоже, не имеет значения, поскольку второе поле со списком работает нормально.

Я могу воспроизвести закрытие всплывающей области каждый раз, нажимая прямо в центре раскрывающейся кнопки. Щелчок выше или ниже центра кнопки, и он работает нормально.

Если бы мне пришлось угадывать, что происходит, это означало бы, что из-за количества элементов всплывающее окно занимает больше времени, чем обычно, и что оно временно закрывает область под мышью, а событие мыши не отменяется, и поэтому всплывающая область немедленно закрывается. Я не знаю, но я не могу придумать ничего другого и как это исправить.

Пример приложения:

 <?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"
                       applicationComplete="windowedapplication1_applicationCompleteHandler(event)">

    <fx:Style>
        @namespace s "library://ns.adobe.com/flex/spark";
        @namespace mx "library://ns.adobe.com/flex/mx";

        s|Scroller {
            skinClass: ClassReference("com.flexcapacitor.skins.MinimalScrollerSkin");
        }
    </fx:Style>
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayList;
            import mx.events.FlexEvent;

            protected function windowedapplication1_applicationCompleteHandler(event:FlexEvent):void
            {
                var fontList:Array = Font.enumerateFonts(true);
                fonts.dataProvider = new ArrayList(fontList);
                fontSizes.dataProvider = new ArrayList([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
                fonts.selectedIndex = fontList.length-1;
                fontSizes.selectedIndex = fontSizes.dataProvider.length-1;
            }

            public function fontLabelFunction(object:Object):String {
                if (object is Font) {
                    return Font(object).fontName;
                }
                return object as String;
            }
        ]]>
    </fx:Script>

    <s:HGroup verticalCenter="0" horizontalCenter="0">
        <s:ComboBox id="fonts" labelFunction="fontLabelFunction"/>
        <s:ComboBox id="fontSizes"/>
    </s:HGroup>

</s:WindowedApplication>
  

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

Комментарии:

1. Не могли бы вы поделиться примером кода, чтобы мы могли попытаться воспроизвести его?

2. Добавлен пример кода

3. Похоже, это было вызвано ошибкой в minimalScrollerSkin.

4. Отлично! вы это исправили. К сожалению, я не смог воспроизвести вашу проблему.

Ответ №1:

Похоже, это было вызвано ошибкой в MinimalScrollerSkin. В классе MobileSkin есть свойство, называемое useMinimumHitArea . MinimalScrollerSkin и связанные с ним классы расширяют MobileSkin. По умолчанию для этого свойства установлено значение true.

В документации для этого свойства указано:

Переключает прозрачную, центрированную область попадания, если размер без масштабирования составляет менее одной четверти квадратного дюйма. Физический размер зависит от applicationDPI.

Установка для этого свойства значения false в оболочках исправила проблему. Также исправлена проблема, из-за которой область попадания дорожки переполнялась содержимым контейнера. Мне пришлось создать VScrollBarTrackSkin, чтобы исправить это, поскольку установка useMinimumHitArea была единственной, которая рисовала дорожку.