Перемещение дочерних элементов контейнера (определенного в MXML) внутри внутреннего контейнера

В настоящее время я работаю над пользовательским компонентом, который расширяет Canvas (назовем его SuperCanvas); По сути, это контейнер, позволяющий масштабировать и панорамировать его содержимое.

Было бы слишком долго объяснять почему, но я не могу использовать scrollRect, поэтому мне пришлось объявить объект Canvas (названный innerCanvas) ... внутри моего SuperCanvas (я знаю, не очень приятно знак равно

Я хотел бы знать, есть ли правильный способ «перенаправить» создание моих дочерних компонентов на этом холсте.

Позволь мне объяснить:

<comp:SuperCanvas id="superCanvas">
   <mx:Image id="img" source="image.jpg"/>
   <mx:Label id="lbl" text="Sample"/>
</comp:SuperCanvas>

Таким образом, в мой SuperCanvas добавляются img и lbl. Вместо этого я хочу, чтобы они были добавлены в superCanvas.innerCanvas.

Я не могу переопределить методы add / removeChild для «перенаправления», так как я не смогу добавить этот innerCanvas ...

Итак, я попробовал это:

<comp:SuperCanvas>
   <comp:innerCanvas>
      <mx:Image id="img" source="image.jpg"/>
      <mx:Label id="lbl" text="Sample"/>
   </comp:innerCanvas>
</comp:SuperCanvas>

Но Flex жалуется, что «В инициализаторе для 'contents': тип mx.controls.Image не может быть назначен целевому типу mx.containers.Canvas». Я читал, что могу использовать массив UIComponents с метатегом [ArrayElementType] и вручную создавать экземпляры объектов, но я ищу более простое (и, вероятно, подходящее) решение.

Я также видел свойство childDescriptor (которое содержит описания для каждого дочернего элемента, определенного в файле MXML), но оно предназначено только для чтения, поэтому я не могу передать его своему innerCanvas.

Если я недостаточно ясен, не стесняйтесь спрашивать меня о точности, английский не мой родной язык, поэтому довольно сложно объяснить вещи хорошо = /

Любая помощь будет принята с благодарностью, я полностью застрял.


РЕДАКТИРОВАТЬ: Мой класс SuperCanvas (без импорта и логики масштабирования и панорамирования, которая здесь не имеет значения):

public class SuperCanvas extends Canvas
{
    public innerCanvas:Canvas = new Canvas();

    public function SuperCanvas()
    {
      super();
      addChild( innerCanvas );
    }
}

person Zed-K    schedule 27.01.2010    source источник
comment
Каковы определения классов SuperCanvas, innerCanvas?   -  person Patrick    schedule 27.01.2010
comment
Отредактировал свой вопрос с определением.   -  person Zed-K    schedule 28.01.2010


Ответы (1)


В этой записи в блоге подробно описаны подход, при котором вы добавляете компоненты в SuperCanvas, но затем перемещаете их все на внутренний холст после создания. Так что это обходной путь.

В качестве альтернативы вы можете установить DefaultProperty как объект типа dataProvider, а затем добавлять элементы на внутренний холст оттуда, вместо того, чтобы сначала делать их дочерними элементами SuperCanvas.

Добавление:

Я наткнулся на эту запись в блоге, в котором, среди прочего, говорится о Panel и как он решает эту проблему. Вы можете посмотреть на это и на Panel исходный код.

person Michael Brewer-Davis    schedule 28.01.2010
comment
Спасибо большое за вашу помощь! Я попробовал решение из jocabola.blog, которое кажется довольно приятным. Однако при таком подходе я не могу получить доступ к моему событию innerCanvas CREATION_COMPLETE (которому мне нужно получить его ширину и высоту). В конце метода addComponents () мои ширина и высота innerCanvas равны 0. - person Zed-K; 28.01.2010
comment
Хм. Можете ли вы вызвать validateNow [внутренний или внешний] контейнер, чтобы заставить его совершать движения? - person Michael Brewer-Davis; 28.01.2010
comment
Я пробовал это, но, похоже, сейчас я столкнулся с другой проблемой; свойства width и height остаются равными 0. Проблема в том, что компоненты изображения, которые я помещаю в свой холст, еще не завершили загрузку на этом этапе. Я переопределил класс Image, чтобы отправить его событие creationComplete только после завершения загрузки (когда доступны его свойства ширины и высоты). Но я понял, что контейнеры Flex не ждут, пока их дочерний элемент отправит собственное событие creationComplete, чтобы отправить свое (не уверен, что я очень ясно, извините = /). Кстати, это еще одна проблема. Большое спасибо! - person Zed-K; 28.01.2010