【问题标题】:Adobe Flex/AIR: Scrolling a sub-component, not the whole windowAdobe Flex/AIR:滚动子组件,而不是整个窗口
【发布时间】:2011-07-22 17:31:18
【问题描述】:

我正在使用 Adob​​e 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”框可能包含一个巨大的子组件列表,而这个长列表的存在会导致一个垂直滚动条出现在 GUI 的最高级别,围绕“MainContainer”vbox。

看起来很傻,在整个应用程序窗口周围都有滚动条。

我正在寻找的解决方案是滚动条仅应用于“MainContent”vbox(以及 Navigation 和 HelpContent 面板,如果它们的内容超出窗口边界)。

我在 StackOverflow 上找到了一个related question,问题的解决方案是在父容器上使用“autoLayout”和“verticalScrollPolicy”属性。

所以我尝试将 autoLayout="false" 和 verticalScrollPolicy="off" 属性添加到所有父容器,并将 verticalScrollPolicy="on" 属性添加到“MainContent”vbox。但该实验的最终结果是内容只是从主容器中剪切出来的(并且在 MainContent vbox 中添加了一个没有拇指的无用滚动条)。

有人知道怎么解决吗?

【问题讨论】:

    标签: apache-flex layout air scrollbars


    【解决方案1】:

    HBox 或 VBox 将尽可能努力地在没有滚动条的情况下显示其内容。如果内容太大而无法容纳在可用范围内,这会强制父容器(通常一直到主应用程序)成为必须滚动的容器。

    在幕后,HBox 或 VBox 正在其 measure() 函数中设置measuredMinWidth 和measuredMinHeight 属性以匹配其子项所需的尺寸。父容器将接受该建议,并且滚动任务会在显示列表中向上移动。

    hasseg 的解决方案在许多情况下都有效,因为它会阻止容器进行测量,但它有点笨拙。在不为容器构建替换子类的情况下,您可以执行以下操作。在要滚动的容器实例上,将 minWidth 或 minHeight 设置为 0。这将优先于该容器的measuredMinWidth 或measuredMinHeight 属性,允许父级将实际大小设置为更易于管理的值。

    【讨论】:

      【解决方案2】:

      找到了解决办法。

      看起来阻止 VBox 积极扩展其垂直空间(并迫使其父级增长滚动条)的唯一方法是将 VBox 包装在 Canvas 中。

      有一个方便的小组件here,称为 ScrollableVBox,它在解决一些簿记问题的同时执行解决方法(例如在 VBox 中添加和删除子项,将它们传递给 Cavas 包装器)。

      【讨论】:

        【解决方案3】:

        不要将 VBox 包装在 Canvas 中,而是将您想要滚动条的 VBox 的 minHeight 属性设置为 0。

        【讨论】:

          【解决方案4】:

          您的问题看起来很像我前段时间遇到的问题。我从this discussion 找到了答案:只需禁用Boxmeasure() 实现即可。

          这是一个非常简单的解决方案,在我的情况下非常有效,并且没有造成任何“附带损害”。您的结果可能会有所不同。

          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 */ }
              }
          }
          

          【讨论】:

          • 我会在下午晚些时候试一试。不过,我想,禁用措施使得难以提供容器的水平调整大小。我只是想解决垂直滚动问题。
          • 你是完全正确的——这是一个非常激烈的技巧,但在某些特定情况下可能有用(比如我的)。
          猜你喜欢
          • 2010-12-03
          • 1970-01-01
          • 2011-06-28
          • 2013-06-12
          • 2012-01-18
          • 2015-02-12
          • 2016-10-26
          • 2010-11-23
          • 1970-01-01
          相关资源
          最近更新 更多