Я пытаюсь создать datagrid, который будет изменяться по вертикали, чтобы все визуализаторы отображались в полном объеме. Кроме того,Flex - проблема с автоматическим изменением размера datagrid
- Renderers имеют переменную высоту
- Renderers может изменить размер себя
Вообще говоря, поток событий выглядит следующим образом:
- Один из элементов рендереров изменяет себя (обычно в ответ на щелчок пользователя и т. д.)
- Он отправляет пузырящее событие, которое родительский набор данных поднимает
- DataGrid пытается изменить размер, чтобы все визуализаторы оставались видимыми в полном объеме.
В настоящее время я использую этот код в сетке данных для вычисления высоты:
height = measureHeightOfItems(0, dataProvider.length) + headerHeight;
Это, как представляется, получить неправильную высоту. Я пробовал несколько вариантов, включая callLater (чтобы гарантировать, что размер изменен, так что показатель может работать корректно) и переопределяя meausre() и вызывая invalidateSize()/validateSize(), но не работает.
Ниже приведены 3 класса, которые иллюстрируют проблему. Щелчок по кнопке в средствах рендеринга элементов изменяет размер рендеринга. Сетка также должна расширяться, чтобы все три рендеринга были показаны полностью.
Любые предложения были бы весьма полезными.
С уважением
Marty
DataGridProblem.mxml (файл приложения)
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
xmlns:view="view.*">
<mx:ArrayCollection id="dataProvider">
<mx:String>Item A</mx:String>
<mx:String>Item B</mx:String>
<mx:String>Item C</mx:String>
</mx:ArrayCollection>
<view:TestDataGrid
id="dg"
dataProvider="{ dataProvider }"
width="400">
<view:columns>
<mx:DataGridColumn dataField="text" />
<mx:DataGridColumn itemRenderer="view.RendererButton" />
</view:columns>
</view:TestDataGrid>
</mx:Application>
view.TestDataGrid.as
package view
{
import flash.events.Event;
import mx.controls.DataGrid;
import mx.core.ScrollPolicy;
public class TestDataGrid extends DataGrid
{
public function TestDataGrid()
{
this.verticalScrollPolicy = ScrollPolicy.OFF;
this.variableRowHeight = true;
this.addEventListener(RendererButton.RENDERER_RESIZE , onRendererResize);
}
private function onRendererResize(event : Event) : void
{
resizeDatagrid();
}
private function resizeDatagrid():void
{
height = measureHeightOfItems(0, dataProvider.length) + headerHeight;
}
}
}
view.RendererButton.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Button width="50" height="50"
click="onClick()" />
<mx:Script>
<![CDATA[
public static const RENDERER_RESIZE : String = "resizeRenderer";
private function onClick() : void
{
this.height += 20;
dispatchEvent(new Event(RENDERER_RESIZE , true));
}
]]>
</mx:Script>
</mx:HBox>
d oh ... там должен быть способ работать. – DyreSchlock