У меня AdvancedDataGrid с переменной высотой строки, установленной в true.Я написал средство визуализации элемента cutsom, основанное на искровом компоненте DataGroup.У каждой строки в сетке есть несколько объектов для отображения, положение и ширина x объектов основаны на данных самого объекта.
У меня есть собственный макет, написанный для DataGroup, который измеряет и позиционирует каждый объектна основании своих данных.Каждый объект в каждой строке может усекать или не усекать свою метку.Когда метки не усекаются, я вычисляю фактическую ширину объекта и проверяю его размер вручную (чтобы заставить метку иметь правильную ширину и разметку всех ее текстовых строк и переизмеряю себя) в методе измерения Layout группы DataGroup для точного измеренияСама группа данных.
Все макеты, размеры, размеры, отображение и т. д. работают правильно.Объекты сообщают правильную высоту, в которой они нуждаются, когда не обрезают метки, группа данных сообщает правильный размер, необходимый для рисования всей сущности своей строки (все из методов измерения, которые им необходимы в жизненном цикле UIComponent).
Когда внутри самой AdvancedDataGrid, строки имеют неправильный размер.Большинство строк не требуют нескольких строк и отображаются просто отлично.Те, которые требуют нескольких строк, имеют большую высоту строки, но недостаточно большие, чтобы вместить весь текст в большинстве случаев.Группа данных для этой строки (и ее itemRenderers) обрезаются.Кроме того, при прокрутке сетки каждая прокручиваемая строка на экране имеет высоту текстовой строки в 1 по умолчанию, независимо от данных.В любом случае изменение размера AdvancedDataGrid (не изменение размеров его столбцов, но самой сетки) заставляет все строки привязываться к правильной требуемой высоте.Повторная прокрутка приводит к появлению строк неправильного размера.
Кроме того, расположение каждого объекта в строке определяется несколькими внешними факторами - чаще всего это видимый диапазон (по горизонтали).Изменение этого видимого диапазона приведет к тому, что все средства визуализации элементов изменят свой размер (через пользовательский класс макета) до новых размеров и переизмерит новый макет DataGroup.Это фактически запускает пользовательский анализатор иерархии, который перестраивает все ArrayCollections, используемые в поставщике данных AdvandedDataGrid, поэтому ArrayCollections отправляет события изменения, на которые реагирует каждая группа данных DataGroup, поэтому сама группа DataGroup аннулирует свой размер и макет.
Этиизменение размеров не приводит к тому, что AdvancedDataGrid переоценивает высоту строк, и я должен снова изменить размер самого ADG, чтобы привязать строки к правильной высоте.
Любой имеет опыт работы со строками динамического размера в AdvancedDataGrid или ItemRenderers, которые должныпринудительно заставить AdvandedDataGrid перекомпоновывать свои строки?
К сожалению, я не могу предоставить исходный код, так как в это входит огромное количество классов, иерархические данные, сворачивание закрытых узлов в несколько строк, пользовательские анализаторы иерархии,множество средств визуализации элементов - это и государственный контракт.
Я столкнулся с аналогичной проблемой, связанной с гораздо более простым средством визуализации элементов, в основном с меткой, котораяВы будете учитывать максимальную высоту, изменяете размеры до той высоты, которая потребуется для данных переноса слов, а затем создаете полосы прокрутки для себя.Опять же, размеры данных почти совпадают при создании сетки, тогда изменение ширины столбца в сетке не изменяет размер строки, так как средство визуализации элементов подстраивается под новую ширину.Только при изменении размера самой сетки средства визуализации элементов изменяют размер правильно, создают полосы прокрутки, и высоты строк сетки являются правильными.Источник для этого средства визуализации элементов:
<s:Scroller xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
implements="mx.controls.listClasses.IDropInListItemRenderer,mx.controls.listClasses.IListItemRenderer"
horizontalScrollPolicy="off" width="100%">
<fx:Script>
<![CDATA[
import mx.controls.listClasses.BaseListData;
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.IListItemRenderer;
import mx.events.ResizeEvent;
private var _listData:BaseListData;
private var _data:Object;
private var _listOrData_c:Boolean = false;
public function get listData():BaseListData
{
return _listData;
}
public function set listData(value:BaseListData):void
{
_listData = value;
_listOrData_c = true;
invalidateProperties();
}
public function get data():Object
{
return _data
}
public function set data(value:Object):void
{
_data = value;
_listOrData_c = true;
invalidateProperties();
}
override protected function commitProperties():void
{
if(_listOrData_c)
{
_listOrData_c = false;
label.text = _listData.label;
}
super.commitProperties();
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Group width="100%">
<s:layout>
<s:BasicLayout clipAndEnableScrolling="true" />
</s:layout>
<s:Label id="label" width="100%"/>
</s:Group>
</s:Scroller>
Бросьте его в AdvancedDataGrid и установите некоторые данные с очень большими текстовыми блоками.Измените размеры столбцов, затем измените размер самой сетки, надеюсь, вы сможете воспроизвести те же результаты.Убедитесь, что вы установили максимальную высоту для средств визуализации элементов, например:
<mx:AdvancedDataGridColumn id="adgc1" headerText="Name" dataField="label">
<mx:itemRenderer>
<fx:Component>
<newLayouts:ScrollingTextItemRenderer maxHeight="60" />
</fx:Component>
</mx:itemRenderer>
</mx:AdvancedDataGridColumn>
Использование Flex 4.1.
Спасибо за помощь.
Вот скриншоты, детализирующие средство визуализации элемента, как оно должно функционировать (поскольку я установил измерение, чтобы принудительно проверять метку при явной ширине тока перед измерением):
Очень широкий столбец, без полос прокруткиИзмеренная высота меток отображается в высоте строки
Столбец с меньшей шириной, некоторые средства визуализации достигли максимальной высоты и создают полосы прокрутки, последний модуль визуализации все еще использует измеренную высоту метки
Меньший по-прежнему столбец, все максимальные высоты достигнуты и скроллеры присутствуют для всех меток, скроллеры будут выбирать строку при использовании, но разрешать прокрутку, чтобы весь текст можно было просмотреть.