Предоставление свойств классу Spark Skin - PullRequest
1 голос
/ 02 сентября 2011

У меня проблемы с наложением головы на класс скинов по отношению к его компоненту хоста.По сути, из того, что я видел в большинстве оболочек Flex 4, они напрямую не отображают свойства, которые динамически устанавливаются в компоненте хоста.Вместо этого они определяют состояния, которые подвергаются воздействию класса скина, чтобы определить, когда компонент должен выглядеть иначе.Это все прекрасно, когда у вас есть очень простой компонент со стандартным набором состояний, но когда у вас есть двадцать различных свойств (гипотетически) для установки в вашем хост-компоненте, которые должны изменить то, как выглядит скин, он может очень быстро усложниться..

Я видел, как они обошли это, путем переопределения commitproperties и аннулирования функций в классе скина, получения значений для свойств, которые они оттуда хотят, и затем установки ихв локально созданную переменную внутри класса скина.Это нормально, но я чувствую, что это всего лишь обходной патч, который делает вещи намного сложнее, чем нужно.

ЗДЕСЬ МОЙ ВОПРОС: Есть ли способ напрямую показать связываемое свойство изкласс компонента хоста, поэтому, когда вы определяете класс скина, он напрямую готов к чтению?Допустим, у вас есть пользовательская кнопка с логическим свойством 'selected'.В классе скинов вы хотите добавить функцию get и set для свойства selected, чтобы вы могли выполнять некоторые действия с вашим скином, когда бы он ни был установлен.Как сообщить классу скина, что это доступное свойство для работы с компонентом хоста?

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

Этот вопрос существует на очень теоретическом уровне. Мне не ясно, что вы пытаетесь достичь, или какие свойства вы устанавливаете в своем классе компонентов. Я подозреваю, что есть проблема архитектуры, если у вас есть 20 свойств, и каждое из них должно как-то соотноситься с разными состояниями кожи.

Однако я могу попытаться ответить на ваши конкретные вопросы.

Is there any way to directly expose a bindable property from the

класс компонента хоста, поэтому при определении класса скина он напрямую готов к чтению с?

При создании Flex MobileSkins они рекомендуют создать свойство с именем hostComponent, которое дает классу скина ссылку на класс компонента. Скины MXML уже имеют аналогичное свойство . Если вы используете пользовательский скин, это свойство создается автоматически с использованием метаданных HostComponent. Поэтому из класса скина вы можете получить доступ к свойствам класса компонента, используя свойство hostComponent.

Допустим, у вас есть пользовательская кнопка с логическим свойством «Выбрано». В классе скинов вы хотите добавить в get и set функция для свойства selected, поэтому вы можете выполнить какое-либо действие на вашей коже, когда бы она ни была установлена.

Я не представляю ситуацию, когда вы захотите это сделать. Как правило, вы не определяете какие-либо свойства класса скина, которые вы намерены явно изменить в экземпляре класса скина.

Вы можете отправить событие из класса компонента при изменении свойства. [Это очень распространено]. Затем прослушайте это событие в классе скина, используя свойство hostComponent, и измените его там.

Существует также способ доступа к экземпляру класса скина из класса компонента. Таким образом, вы можете изменить свойства непосредственно в классе скина, используя свойство skin .

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

0 голосов
/ 05 сентября 2011

Когда вы воздействуете на обложку для компонента, вы можете использовать метатеги для хранения ссылки на фактически используемую часть обложки:

[SkinPart(required="false")]
public var resizeHandle:UIComponent;

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

override protected function partAdded( partName:String, instance:Object):void
{
    super.partAdded(partName, instance);

    if (instance == resizeHandle) {
            resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN, resizeHandle_mouseDownHandler);
    }
}

override protected function partRemoved(partName:String, instance:Object):void
{
    if (instance == resizeHandle) {
        resizeHandle.removeEventListener(MouseEvent.MOUSE_DOWN, esizeHandle_mouseDownHandler);
    }

    super.partRemoved(partName, instance);
}

Кроме того, поскольку вы сохранили ссылку на части скина, вы все равно можете получить к ней доступ, когда захотите, в своем хост-компоненте и обновить ее. Я чист ? : -)

...