Я пытаюсь создать сетку данных, размер которой будет изменен по вертикали, чтобы обеспечить полное отображение всех средств визуализации. Кроме того,
- Рендереры переменной высоты
- Рендерер может изменить размер себя
В общем, поток событий выглядит следующим образом:
- Один из средств визуализации элементов изменяет свой размер (обычно в ответ на щелчок пользователя и т. Д.)
- Он отправляет всплывающее событие, которое обнаруживает родительская сетка данных
- DataGrid пытается изменить размер, чтобы все визуализаторы оставались видимыми в полном объеме.
В настоящее время я использую этот код в сетке данных для вычисления высоты:
height = measureHeightOfItems(0, dataProvider.length ) + headerHeight;
Это похоже на неправильную высоту. Я пробовал несколько вариантов, включая callLater (чтобы убедиться, что изменение размера завершено, чтобы мера могла работать правильно), и переопределение meausre () и вызов invalidateSize () / validateSize (), но ни один из них не работает.
Ниже приведены 3 класса, которые проиллюстрируют проблему. Нажатие кнопки в элементе рендерера изменяет размер рендерера. Сетка также должна расшириться, чтобы все 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>