Масштабирование Spark DataGrid с фиксированным количеством строк и без сколлеров

Это изменение размера масштабируется с помощью: stage.scaleMode = StageScaleMode.SHOW_ALL; // Нет веской причины, потому что масштабировать нужно только Datagrids

Я пытаюсь найти способ масштабирования (шрифтом или масштабом X и Y) DataGrid (с requestMinRowCount = requestMaxRowCount = requestRowCount = dataProviderLength), чтобы он всегда отображал все строки (без прокрутки).

Решение, которое я придумал для масштабирования:

protected function thisDatagrid_resizeHandler(event:ResizeEvent):void
{
   if (event.oldWidth < this.width) {
     this.setStyle('fontSize', this.getStyle('fontSize') + 0.5);
   } else if (event.oldWidth > this.width) {
      this.setStyle('fontSize', this.getStyle('fontSize') - 0.5);
   }
   this.minWidth = this.measuredMinWidth;
}

Хотя приведенный выше код действительно изменяет размер текста (следовательно, ячейки, столбца и сетки) при изменении размера, проблема, с которой я сталкиваюсь, заключается в том, что масштабирование происходит по вертикали.

Для работы requiredRowCount не должно быть фиксированной высоты, установленной для Datagrid. Поэтому мне интересно, как заставить сетку постоянно отображать все строки и столбцы при масштабировании (даже при изменении размера по вертикали)?

Другой вариант - переопределить updateDisplayList, но не сразу для изменения размера.

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

     //super.updateDisplayList(unscaledWidth, unscaledHeight);              
     trace('oldWidth: ' + oldWidth + '  | unscaledWidth: ' + unscaledWidth + '  | parentWidth: ' + this.parent.width);
     trace('oldHeight: ' + oldHeight + '  | unscaledHeight: ' + unscaledHeight + '  | parentHeight: ' + this.parent.height);
     trace('Potential ScaleX: ' + (unscaledWidth - oldWidth)/unscaledWidth);
     trace('Potential ScaleY: ' + (unscaledHeight - oldHeight)/unscaledHeight);
     trace('----------------------------------------------------');
     /* scaleX = (unscaledWidth - oldWidth)/unscaledWidth;
     scaleY = (unscaledHeight - oldHeight)/unscaledHeight; */

     //super.updateDisplayList(unscaledWidth, unscaledHeight);
}

Проблема с этим, если я раскомментирую scaleX и scaleY, он будет зацикливаться навсегда ...


person Yozef    schedule 01.11.2011    source источник


Ответы (2)


Возможно, я вас неправильно понял, но не могли бы вы просто использовать:

<?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">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:DataGrid
        id="grid"
        width="100%"
        requestedRowCount="{grid.dataProvider.length}"
        rowHeight="24"
        fontSize="12"
        horizontalScrollPolicy="off"
        verticalScrollPolicy="off">

        <s:dataProvider>
            <s:ArrayCollection>
                <s:source>
                    <fx:Object id="one" label="One" value="1" />
                    <fx:Object id="two" label="Two" value="2" />
                    <fx:Object id="three" label="Three" value="3" />
                </s:source>
            </s:ArrayCollection>
        </s:dataProvider>

        <s:columns>
            <s:ArrayCollection>
                <s:GridColumn dataField="label" headerText="Label" />
                <s:GridColumn dataField="value" headerText="Value" />
            </s:ArrayCollection>
        </s:columns>
    </s:DataGrid>
</s:Application>
person Darren    schedule 14.11.2011
comment
Я удалил атрибуты minWidth / Height на уровне приложения, после чего изменил DataGrid, чтобы иметь значения scaleX / Y 0,5, 1 и 1,5, и каждый раз он выглядел нормально. Не могли бы вы указать, что вы видите неверно? - person Darren; 15.11.2011
comment
Что я имею в виду: 1- Создайте Datagrid (с requiredRowCount = requestedMinRowCount = requiredMaxRowCount = dataProviderLength) шириной 100% 2- Запустите его 3- Захватите правый нижний угол, чтобы изменить масштаб окна Сетка масштабируется по ширине, если я масштабирую на высоте либо начинает съедать Datagrid (изменение размера), либо создает пустое пространство (уменьшение размера). - person Yozef; 15.11.2011
comment
Задача состоит в том, чтобы оно масштабировалось, чтобы все строки и столбцы оставались в поле зрения (без прокрутки) после изменения размера окна. Datagrid будет масштабироваться вместе с окном (если я увеличиваю масштаб), сетка будет масштабироваться вместе с ним, возможно, сетка станет больше (также шрифт), и то же самое верно, если я масштабируюсь меньше. Спасибо, Даррен. - person Yozef; 15.11.2011

Лучший (и наиболее эффективный способ - использовать макет группы, в которой будут расположены датагриды, и применить макет, подобный приведенному ниже:

пример: ScaleOneLayout.as

import mx.core.UIComponent;

import spark.layouts.BasicLayout;

public class ScaleOneLayout extends BasicLayout
{
    public function ScaleOneLayout()
    {
        super();
    }

    override public function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
   {
        var child:UIComponent;
        child = target.getElementAt(0) as UIComponent;
        child.setLayoutBoundsSize(child.getPreferredBoundsWidth(), child.getPreferredBoundsHeight());
        child.scaleX = unscaledWidth / child.width;
        child.scaleY = unscaledHeight / child.height;
    }
}
person Yozef    schedule 22.11.2011