Adobe Flex / AIR: Rolagem de um sub-componente, não o todo janela

votos
5

Estou desenvolvendo um aplicativo com Adobe Flex e AIR, e eu fui bater minha cabeça contra a parede tentando descobrir como resolver um problema de rolagem.

A estrutura básica da minha janela principal do aplicativo (simplificou muito) é o seguinte:

<?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>

O problema é que a caixa mainContent pode conter uma enorme lista de subcomponentes, e a presença dessa longa lista faz com que uma barra de rolagem vertical para aparecer ao mais alto nível do GUI, em torno do vbox MainContainer.

Parece muito bobo, tendo barras de rolagem em torno da janela do aplicativo inteiro.

O que eu estou procurando em vez disso é uma solução em que a barra de rolagem só é aplicada ao vbox mainContent (assim como a navegação e painéis HelpContent, se seus trechos de conteúdo passado os limites da janela).

Eu encontrei uma pergunta relacionada em StackOverflow, onde a solução do problema era usar autoLayout e verticalScrollPolicy atributos em recipientes pai.

Então, eu tentei adicionar autoLayout = false e verticalScrollPolicy = off atribui a todos os recipientes pai, bem como verticalScrollPolicy = on para o vbox mainContent. Mas o resultado final dessa experiência foi que o conteúdo foi simplesmente cortada a partir do recipiente principal (e uma barra de rolagem inútil sem polegar foi adicionado ao vbox mainContent).

Alguém sabe como resolver isto?

Publicado 10/12/2008 em 02:29
fonte usuário
Em outras línguas...                            


4 respostas

votos
6

Um HBox ou um VBox vai tentar tão duro quanto possível para exibir seu conteúdo, sem barras de rolagem. Isso força um recipiente pai (muitas vezes todo o caminho até a aplicação principal) para ser o único que deve rolar se o conteúdo é muito grande para caber nos limites disponíveis.

Nos bastidores, o HBox ou VBox está definindo as propriedades measuredMinWidth e measuredMinHeight na sua função measure () para corresponder às dimensões exigidas por seus filhos. O contêiner pai vai honrar essa recomendação e a tarefa de rolagem move-se a lista de exibição.

A solução da hasseg funciona em muitos casos, porque ele pára o recipiente de medição, mas é o tipo de hacky. Aqui está o que você pode fazer sem a construção de subclasses de reposição para seus recipientes. Na instância recipiente que você deseja rolar, definir minWidth ou minHeight a 0 . Isto irá ter precedência sobre o measuredMinWidth ou propriedades measuredMinHeight desse recipiente, permitindo que o pai para definir o tamanho real para algo mais gerenciável.

Respondeu 11/12/2008 em 23:40
fonte usuário

votos
1

Encontrado uma solução.

Parece que a única maneira de impedir que o VBox de estender agressivamente seu espaço vertical (e forçando seus pais para crescer barras de rolagem) é envolver o VBox em uma lona.

Há um componente útil pouco aqui , chamado ScrollableVBox, que executa a solução alternativa ao cuidar de algumas questões Bookkeping (como adição e remoção filhos para o VBox, passando-os ao redor do invólucro Cavas).

Respondeu 10/12/2008 em 13:24
fonte usuário

votos
0

Em vez de envolver o VBox em uma lona, ​​definir minHeight propriedade do VBox você quer ter a barra de rolagem para 0.

Respondeu 26/01/2011 em 10:38
fonte usuário

votos
0

Seu problema parece ser muito parecido com um que eu lutava com algum tempo atrás. Eu encontrei a minha resposta a partir dessa discussão : basta desativar a measure()implementação do Box.

Esta foi uma correção muito fácil que funcionou perfeitamente no meu caso e não causou qualquer "dano colateral". Seus resultados podem variar.

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 */ }
    }
}
Respondeu 10/12/2008 em 13:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more