#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 была единственной, которая рисовала дорожку.