2010-03-11 2 views
2

Краткая версия: выпадающий список ComboBox работает и отображается правильно перед полноэкранным, но не во время или после.Как устранить проблему выпадающего списка ComboBox в полноэкранном режиме?

Я не совсем уверен, как спросить об этом, поэтому я действительно сделал a page demonstrating the error с очень простым Flex-приложением и всеми тремя направлениями, которые вам нужны, чтобы испытать проблему самостоятельно.

Для тех из вас, кто недостаточно смел следовать моей ссылке выше, я сделаю все возможное, чтобы объяснить здесь. Я создал довольно обширное приложение Flex (а не тот, что в ссылке), в котором есть некоторые графики и диаграммы, флажки и другие элементы управления для этих диаграмм. В нижней части приложения в нескольких государствах приложения есть ComboBox (например, тег <select> в HTML). Поскольку это находится на самом дне, когда вы щелкаете по нему, чтобы открыть раскрывающееся меню, Flex задумчиво выйдет из него.

Это хорошо работает до полноэкранного режима. При входе в полноэкранный режим я масштабирую все с помощью stage.scaleMode = StageScaleMode.SHOW_ALL. Теперь, когда вы нажимаете на ComboBox, выпадающее окно удивительно велико и фактически падает ниже ComboBox, в результате чего оно в основном исчезает за кадром. Лучшая часть - когда вы выходите из полноэкранного режима, выпадающий список настаивает на том, чтобы продолжать падение ниже ComboBox, который расположен в нижней части приложения, и поэтому продолжает прерываться. Кто-нибудь еще сталкивался с этим зверьком, смотрел на него с большой пастью и побеждал?

Вы можете получить код из источника просмотра в ссылке и поблагодарить вас за ваше время.

+0

Я думаю, это потому, что ComboBox размещает свой компонент List непосредственно на сцене. Найдите способ заставить его поместить Список в себя, и вы решили проблему. Если вам это удастся, сообщите всем, ответив на ваш вопрос. – webwise

+0

+1 для такой большой демонстрации проблемы. – invertedSpear

+0

Моим обходным путем до сих пор является просто стиль падения вниз через «позицию», чтобы разместить его над ComboBox. Не идеальный, но, по крайней мере, читаемый. Я пытался привлечь внимание Adobe к этому, сообщив об ошибке и поговорив на форуме FlexCoders. До сих пор их рекомендация заключалась в том, чтобы переопределить фабрику классов, которая отображает ComboBox. По сути, они хотят, чтобы я сам переписал ComboBox. Спасибо, Adobe. – Impirator

ответ

0

У меня были некоторые проблемы с выпадающим списком CB, вроде бы не связанные, но мне пришлось применить изменения непосредственно к выпадающему списку, например myCombo.drowpdown.[insert whatever property], потому что он не применял изменения, внесенные в выпадающий список. Возможно, вы можете попробовать это в своем приложении и посмотреть, помогает ли оно.

1

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

Во-первых, Общее замечание

Flex 3.5 ComboBox использует следующее логическое выражение (строки 1572-73), чтобы определить, следует ли включить его выпадающий список в каплю до списка:

point.y + _dropdown.height > screen.bottom && 
point.y > screen.top + _dropdown.height 

где point.y - глобальная координата для нижней части ComboBox. В принципе, «если он ударит снизу, а не ударит в верх, тогда ...». В противном случае, если он также попадет в верхнюю часть, то он по умолчанию возвращается к бросанию вещи через пол, как мы видим в данном случае. С этим в мыслях...

Частичное Обход

я смог восстановить приложение к своей нормальной функциональности, когда он выходит из полноэкранного режима, добавив следующий код в обработчик на toggleFullscreen() кнопки, при выходе из полноэкранного режима:

... 
    screen.height = height; 
    screen.width = width; 

    myComboBox.dropdown.invalidateSize(); // myComboBox being the id for the ComboBox 
} 

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

Это не много, но по крайней мере это что-то. В противном случае ...

Некоторые подробности о полной проблеме экрана

я заметил две проблемы, происходящие здесь:

  1. Когда это логическое выражение сверху оценивается в полноэкранном режиме, некоторые из значения масштабируются, а некоторые - нет. А именно, point.y и _dropdown.height не масштабируются, тогда как screen.bottom масштабируется (относительно). Итак, первая часть выражения всегда выводится неверно, и, таким образом, ComboBox продолжает отображать список, даже если на самом деле нет места. Я понятия не имею, почему это происходит, но это так. Я попытался воспользоваться этими значениями косвенно без каких-либо неблагоприятных последствий, но у меня также возникло ощущение, что даже если бы я правильно оценил выражение, это не исправило бы другую проблему ...
  2. Тот факт, что когда падение вниз список показывает, что он выглядит двойным масштабированием. То есть вместо масштабирования 3.5, которое ComboBox имел на моем мониторе, выпадающий список выглядел так, как будто он имел масштабирование 3,5 * 3,5. Я не стал слишком много играть с этим, но я скажу, что когда я вручную применил матрицу преобразования, чтобы раскрыть ComboBox, размер, на котором был выведен выпадающий список, выглядел так, будто он соответствовал оригиналу (полноэкранный масштаб) Поле со списком. Может быть, кто-то еще может обманывать это.

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

Удачи.

Смежные вопросы