5

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」ボックスにサブコンポーネントの巨大なリストが含まれている可能性があり、その長いリストが存在すると、GUI の最上位レベルに「MainContainer」vbox を囲む垂直スクロールバーが表示されることです。

アプリケーションウィンドウ全体にスクロールバーがあるのは本当にばかげているように見えます。

代わりに私が探しているのは、スクロールバーが「MainContent」vbox (およびコンテンツがウィンドウの境界を超えて伸びる場合は、Navigation および HelpContent パネル) にのみ適用されるソリューションです。

問題の解決策は、親コンテナーで「autoLayout」および「verticalScrollPolicy」属性を使用することでした。

そこで、すべての親コンテナーに autoLayout="false" および verticalScrollPolicy="off" 属性を追加し、「MainContent」vbox に verticalScrollPolicy="on" を追加してみました。しかし、その実験の最終結果は、コンテンツがメイン コンテナーから単純に切り取られたということでした (そして、つまみのない役に立たないスクロールバーが MainContent vbox に追加されました)。

誰でもこれを解決する方法を知っていますか?

4

4 に答える 4

6

HBox または VBox は、スクロール バーを使用せずにコンテンツを表示しようとします。これにより、コンテンツが大きすぎて使用可能な境界に収まらない場合、親コンテナー (多くの場合、メイン アプリケーションまで) がスクロールする必要があります。

舞台裏で、HBox または VBox は、その子に必要な寸法に一致するように、その measure() 関数でmeasuredMinWidth およびmeasuredMinHeight プロパティを設定しています。親コンテナーはその推奨事項を尊重し、スクロールのタスクは表示リストを上に移動します。

hasseg のソリューションは、コンテナの測定を停止するため、多くの場合機能しますが、ハックのようなものです。コンテナの代替サブクラスを構築せずにできることは次のとおりです。スクロールするコンテナー インスタンスで、minWidth または minHeight を 0 に設定します。これは、そのコンテナーのmeasuredMinWidthまたはmeasuredMinHeightプロパティよりも優先され、親が実際のサイズをより管理しやすいものに設定できるようにします。

于 2008-12-11T22:40:44.463 に答える
1

解決策を見つけました。

VBoxが垂直方向のスペースを積極的に拡張する(および親にスクロールバーを拡大させる)のを防ぐ唯一の方法は、VBoxをキャンバスでラップすることです。

ここには、ScrollableVBoxと呼ばれる便利な小さなコンポーネントがあります。これは、いくつかのブックケッピングの問題(VBoxへの子の追加と削除、Cavasラッパーへの子の受け渡しなど)を処理しながら回避策を実行します。

于 2008-12-10T12:24:19.530 に答える
0

あなたの問題は、私がしばらく前に苦労した問題によく似ているようです。私はこの議論から私の答えを見つけました:ただの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 */ }
    }
}
于 2008-12-10T12:32:45.207 に答える
0

Canvas で VBox をラップする代わりに、スクロールバーを表示する VBox の minHeight プロパティを 0 に設定します。

于 2011-01-26T09:38:30.847 に答える