Перемещение дочерних элементов контейнера (определенного в MXML) внутри «внутреннего контейнера» - PullRequest
1 голос
/ 27 января 2010

В настоящее время я работаю над пользовательским компонентом, который расширяет 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>

При этом img и lbl добавляются в мой SuperCanvas. Я хочу, чтобы они были добавлены в 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 жалуется, что « В инициализаторе для« содержимого »: тип mx.controls.Image нельзя назначить для целевого типа mx.containers.Canvas ». Я прочитал, что могу использовать массив UIComponents с мета-тегом [ArrayElementType] и вручную создавать объекты, но я ищу более простое (и, вероятно, правильное) решение.

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

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

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


EDIT: Мой класс SuperCanvas (без учета импорта и логики масштабирования и панорамирования, которые здесь не имеют значения):

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

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

1 Ответ

1 голос
/ 28 января 2010

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

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

Дополнительно:

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

...