2008-12-10 2 views
5

Я разрабатываю приложение с Adobe Flex и AIR, и я ударяю головой о стену, пытаясь выяснить, как решить прокрутку вопрос.Adobe Flex/AIR: прокрутка подкомпонента, а не целого окна

Основная структура моего основного окна приложения (сильно упрощенных) заключается в следующем:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    paddingTop="0" paddingRight="0" paddingBottom="0" paddingLeft="0" 
    width="800" height="600" layout="vertical" verticalAlign="top" 
> 
    <mx:VBox id="MainContainer" width="100%" height="100%"> 
     <mx:Panel id="Toolbars" width="100%" height="25" /> 
     <mx:HDividedBox width="100%" height="100%" > 
     <mx:Panel id="Navigation" minWidth="200" height="100%" /> 
     <mx:VBox id="MainContent" width="100%"> 
      <mx:Panel width="100%" height="200" /> 
      <mx:Panel width="100%" height="200" /> 
      <mx:Panel width="100%" height="200" /> 
      <mx:Panel width="100%" height="200" /> 
      <mx:Panel width="100%" height="200" /> 
     </mx:VBox> 
     <mx:Panel id="HelpContent" minWidth="200" height="100%" /> 
     </mx:HDividedBox> 
     <mx:Panel id="FooterContent" width="100%" height="25" /> 
    </mx:VBox> 
</mx:WindowedApplication> 

Беда в том, что поле «MainContent» может содержать огромный список подкомпоненты, и присутствие этого длинного списка заставляет вертикальную полосу прокрутки отображаться на самом высоком уровне графического интерфейса, окружающем vbox основного устройства.

Это выглядит действительно глупо, имея полосы прокрутки вокруг всего окна приложения.

То, что я ищу вместо этого, - это решение, в котором панель прокрутки применяется только к vbox основного объекта (а также панели навигации и HelpContent, если их содержимое простирается за пределы окна).

Я нашел related question на StackOverflow, где решение проблемы заключалось в использовании атрибутов autoLayout и verticalScrollPolicy в родительских контейнерах.

Поэтому я попытался добавить атрибуты autoLayout = "false" и verticalScrollPolicy = "off" ко всем родительским контейнерам, а также verticalScrollPolicy = "on" в vbox основного компонента. Но конечным результатом этого эксперимента было то, что контент был просто отсечен из основного контейнера (и в MainContent vbox добавлена ​​бесполезная полоса прокрутки без пальца).

Кто-нибудь знает, как это решить?

ответ

1

Найдено решение.

Похоже, что единственный способ предотвратить агрессивное расширение VBox своего вертикального пространства (и принуждение его родителей к росту полос прокрутки) - обернуть VBox на холсте.

Есть удобный небольшой компонент here, называемый ScrollableVBox, который выполняет обходное решение, заботясь о некоторых проблемах с книжной книгой (например, добавление и удаление детей в VBox, передача их вокруг оболочки Cavas).

0

Ваша проблема кажется очень похожей на ту, с которой я боролся некоторое время назад. Я нашел свой ответ от this discussion: просто отключите реализацию measure()Box.

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

package whatever 
{ 
    import mx.containers.Box; 

    /** 
    * A Box that has no measure() implementation. 
    * 
    * <p> 
    * See http://old.nabble.com/-flex_india%3A3318--Size-layout-issues-with-respect-to-parent-containers-to12882767.html 
    * for more info. 
    * </p> 
    */ 
    public class NonMeasuredBox extends Box 
    { 
     /** 
     * Constructor 
     */ 
     public function NonMeasuredBox():void 
     { 
      super(); 
     } 

     override protected function measure():void { /* disabled */ } 
    } 
} 
+0

Я дам, что попробовать во второй половине дня. Однако я предполагаю, что эта мера отключения затрудняет предоставление горизонтального изменения размера контейнера. Я просто хочу исправить проблему вертикальной прокрутки. – benjismith 2008-12-10 15:18:31

6

HBox или VBox будут стараться как можно сильнее отображать его содержимое без полос прокрутки. Это заставляет родительский контейнер (часто вплоть до основного приложения) быть тем, который должен прокручиваться, если содержимое слишком велико, чтобы соответствовать доступным границам.

За кулисами HBox или VBox настраивает измеренные свойстваMinWidth и measuredMinHeight в своей функции measure() для соответствия размерам, необходимым для его детей. Родительский контейнер будет соблюдать эту рекомендацию, и задача прокрутки перемещается вверх по списку отображения.

Решение hasseg работает во многих случаях, потому что оно останавливает контейнер от измерения, но это своего рода хакки. Вот что вы можете сделать, не создавая заменяющие подклассы для ваших контейнеров.На экземпляре контейнера, который вы хотите прокрутить, установите minWidth или minHeight на 0. Это будет иметь приоритет над измеренными свойствамиMinWidth или measuredMinHeight этого контейнера, позволяя родителям установить фактический размер на что-то более управляемое.

0

Вместо обертывание VBox в Canvas, установите MinHeight свойство VBox вы хотите иметь скроллбар к 0.