1

所以,我有一个 AdvancedDataGrid 需要住在 Canvas 中。我的问题是,当你做这样的事情时,你会得到两组滚动条。此外,AdvancedDataGrid 的水平滚动条在您从右向左滚动时会改变大小,并且不会让您一直滚动到右侧,这看起来很奇怪。

我在 AdvancedDataGrid 上关闭了水平滚动,只让 Canvas 处理它。但是,当我这样做时,列不允许自己调整大小。啊。

我目前的“最佳”解决方案是让 AdvancedDataGrid 处理垂直滚动,让 Canvas 处理水平滚动,但这看起来很疯狂,更不用说我遇到了上面提到的问题,我无法再调整列的大小。

任何帮助是极大的赞赏!谢谢!

4

2 回答 2

4

AdvancedDataGrid 的水平滚动有点特殊,因为它根据可见列的宽度调整其水平滚动拇指的大小。您实际上可以将拇指拖到最后,但可能需要尝试几次。(我知道我知道 ...)

请记住,在 AdvancedDataGrid 中实际上并没有在视口之外渲染任何内容,因此任何大小调整都只是一个受过教育的(好吧,有点受过教育的)猜测。Adobe 这样做是为了让巨大的网格不会陷入爬行状态(想象一下,每次调整窗口大小时,都会在 15,000 个单元的 itemRenderers 上运行测量方法)。

我的建议是关闭画布中的垂直和水平滚动策略,并允许在 ADG 中处理滚动。这很丑陋,但它胜过其他选择。无论如何,ADG 是一个笨重、脾气暴躁的装置,这可能就是 Adob​​e 开源它的原因。我曾多次发誓我永远不会再使用它。我一直能够保持这个誓言,直到下一次我需要它的功能。大约是每周一次。

于 2010-07-23T16:37:32.903 回答
1

AdvancedDataGrid 是画布中唯一的东西吗?

我会将 AdvancedDataGrid 的大小调整为完整的高度和宽度,并让 Canvas 处理滚动。

在画布中,覆盖 updateDisplayList 方法并执行以下操作:

protected function updateDisplayList(unscaledWidth: Number, unscaledHeight: Number):void{
 super.updateDisplayList, unscaledHeight);
 this.myAdvancedDataGrid.setActualSize(this.myAdvancedDataGrid.measuredHeight, this.myAdvancedDataGrid.measuredWidth );
}

这样 AdvancedDataGrid 应该没有滚动条。但是,如果它延伸到极下方或太右,滚动条将出现在画布中。

您可能会受益于阅读Flex Coordinate System。AdvancedDataGrid 是您的“内容”,而 Canvas 将是您的本地。


我正在添加一个完整的运行代码示例来演示我的建议。

这是内部带有 AdvancedDataGrid 的画布组件:com.flextras.stackOverflow.CanvasWithGrid

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                this.myADG.setActualSize(this.myADG.measuredWidth, this.myADG.measuredWidth );
            }

            [Bindable]
            private var dpFlat:ArrayCollection = new ArrayCollection([
                {Region:"Southwest", Territory:"Arizona", 
                    Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000}, 
                {Region:"Southwest", Territory:"Arizona", 
                    Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000},  
                {Region:"Southwest", Territory:"Central California", 
                    Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000},  
                {Region:"Southwest", Territory:"Nevada", 
                    Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000},  
                {Region:"Southwest", Territory:"Northern California", 
                    Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000}, 
                {Region:"Southwest", Territory:"Northern California", 
                    Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000},  
                {Region:"Southwest", Territory:"Southern California", 
                    Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000}, 
                {Region:"Southwest", Territory:"Southern California", 
                    Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}
            ]);

        ]]>
    </fx:Script>

    <mx:AdvancedDataGrid id="myADG" 

                         initialize="gc.refresh();"> <!--  width="100%" height="100%"  -->       
        <mx:dataProvider>
            <mx:GroupingCollection id="gc" source="{dpFlat}">
                <mx:grouping>
                    <mx:Grouping>
                        <mx:GroupingField name="Region"/>
                        <mx:GroupingField name="Territory"/>
                    </mx:Grouping>
                </mx:grouping>
            </mx:GroupingCollection>
        </mx:dataProvider>        

        <mx:columns>
            <mx:AdvancedDataGridColumn dataField="Region"/>
            <mx:AdvancedDataGridColumn dataField="Territory"/>
            <mx:AdvancedDataGridColumn dataField="Territory_Rep"
                                       headerText="Territory Rep"/>
            <mx:AdvancedDataGridColumn dataField="Actual"/>
            <mx:AdvancedDataGridColumn dataField="Estimate"/>
        </mx:columns>
    </mx:AdvancedDataGrid>

</mx:Canvas>

这是主要的应用程序文件:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:stackOverflow="com.flextras.stackOverflow.*">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <stackOverflow:CanvasWithGrid width="200" height="200" />


</s:Application>
于 2010-07-23T16:37:40.283 回答