Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Кастомные стили Flex компоненты (http://www.flasher.ru/forum/showthread.php?t=116872)

romantique 13.10.2008 11:52

Кастомные стили Flex компоненты
 
Я пытаюсь добавить кастомных стилей к компоненте расширяющей mx:Panel. Вот что я делаю:

Файлик skin.css
Код:

.videoPanel
{
        borderSkin : @Embed[( ...
        someStyle : "Hello flasher.ru";
}

Внутри mxml'ки:

Код:

<mx:Style source="skin.css"/>
<video:VideoPanel styleName="videoPanel"/>

И в файлике VideoPanel.as у меня:
Код:

[Style(name="someStyle",type="String",inherit="no")]
public class VideoPanel extends Panel
{
        private static var classConstructed:Boolean = classConstract();

        private static var classConstruct():Boolean
        {
                if( StyleManager.getStyleDeclaration("VideoPanel") == null )
                {
                        var newStyle:CSSStyleDeclaration = new CSSStyleDeclaration();
                        newStyle.setStyle("someStyle","HelloWorld")
                        StyleManager.setStyleDeclaration("VideoPanel",newStyle,true);
                }
                return true;
        }

        override public function styleChanged(styleProp:String)
        {
                super.styleChanged(styleProp);
                if( styleProp=="someStyle" )
                {
                        // тут стоит breakpoint
                }
        }

        ...
}


Проблема в отм, что брейкпоин не достигается.

В любом случае даже если я ставлю брейкпоинт на строчку super.styleChanged(styleProp); и смотрю значение styleProp, - оно null оба раза, когда там останавливается дебаггер.

Но стиль borderSkin (который родной для mx:Panel) к моей компоненте применяется, даже при том условии, что самое значение "borderSkin" никогда не проходит через методstyleChanged().

Я понимаю работу со стилями неправильно? Как стиль borderSkin может примениться к компоненте, если он никогда не проходил через методstyleChanged()? И как мне заставить мой "someStyle" примениться к моей компоненте ?

Any help is appreciated.

PS: I've read the entire part of Adobe Create And Extend Flex 3 Components book about styling... But it didn't help me.

Air_mAn 13.10.2008 14:12

Цитата:

Сообщение от romantique (Сообщение 769964)
Я понимаю работу со стилями неправильно? Как стиль borderSkin может примениться к компоненте, если он никогда не проходил через методstyleChanged()? И как мне заставить мой "someStyle" примениться к моей компоненте ?

До того как высчитаются реальные размеры компонента и он отрисуется, выполняется начальная инициализация стилей и автоматически вызывается метод stylesInitialized(). Чтобы сразу после инициализации обработать свой стиль, отнаследуйтесь от компонента и переопределите этот метод.

romantique 13.10.2008 14:29

Этот метод применяется для доступа к стилям раньше вызовов measure() и updateDisplayList(...). Мне же нужно правильно передать стили из CSS в компоненту, и отследить изменения. Не понимаю, почему styleChanged() не срабатывает. И честно гвооря абсолютно не понял какое отношение метод stylesInitialized() имеет к моей проблеме.

wvxvw 13.10.2008 14:55

Из того, что я понял... нужно вызвать setStyle() у компонента, а не у стиля, тогда работает, как и ожидалось, вот только как отреагировать на присвоение другого класса (а не изменения отдельного свойства) я тож, если чесно, так и не понял =)
Не знаю, умом это не понять... а зачем это все было нужно?
И вообще не понял, зачем нужен styleChanged если можно спокойно оверрайдить setStyle и при этом будут все нужные данные, да и понятнее это как-то...

romantique 13.10.2008 15:14

О логичности свои действий спорить не стану) Эт я вычитал в Adobe Create and Extend Flex Components... Честно говоря я был бы рад, если б мне дали какой то нормальный туториал о том, как правильно делать то, чего я хочу:)

wvxvw 13.10.2008 15:30

Так а что собственно нужно сделать? Если чесно, на сколько я понял назначение styleChanged(), то это нужно для того, чтобы, скажем, вы создаете компонент, описываете стили, которые ему можно назначить, а в этом методе можно прореагировать на их добавление (т.е. скорее всего стили будут назначать пользователи вашего компонента, а не вы сами). Но, опять же, можно было легко обойтись setStyle()... Как бы я имел в виду логичность того, что происходит во фреймворке, а не этот конкретный пример =)

Air_mAn 13.10.2008 16:06

Цитата:

Сообщение от romantique (Сообщение 770002)
Не понимаю, почему styleChanged() не срабатывает. И честно гвооря абсолютно не понял какое отношение метод stylesInitialized() имеет к моей проблеме.

Он срабатывает, но в том случае, когда меняются сразу все стили, параметр styleProp равен null:
Цитата:

Parameters
styleProp:String — The name of the style property, or null if all styles for this component have changed
stylesInitialized() используется как обработчик начальной инициализации стиля, в отличии от styleChanged() который полезен при смене стилей.

romantique 13.10.2008 16:57

А как правильнее задать дефолтные значение моим стилям? От-оверрайдить stylesInitialized() и поставить туда setStyle()'ы ?

Может есть у кого ссылочка на ресурс, где от А до Я написано как грамотно провести процесс добавления и кастомных стилей и реакции на них? Почесал гугл, честно говоря ничего стоящего не нашёл.

А то начитался Adobe доков, а тут другое советуют :)

Air_mAn 13.10.2008 17:18

Цитата:

Сообщение от romantique (Сообщение 770056)
А как правильнее задать дефолтные значение моим стилям? От-оверрайдить stylesInitialized() и поставить туда setStyle()'ы ?

setStyle делать не надо, флекс сам назначит стили, если значения вы загружаете из css. stylesInitialized() нужно использовать, чтобы быть увереным, что это первоначальная установка значения, и она происходит еще до того, как нарисуется компонент. Хотя можно все засунуть и в styleChanged():

Код:

override public function styleChanged(styleProp:String)
        {
                super.styleChanged(styleProp);
                if( !styleProp||styleProp=="someStyle" )
                {
                        var newSomeStyleValue:* = getStyle("someStyle");
                        trace(newSomeStyleValue)
                }


wvxvw 13.10.2008 17:23

Не знаю, я бы просто оверрайдил setStyle и getStyle, а муть с инициализацией, ИМО, никому не нужна... с таким же успехом можно было бы еще разделить переназначение стилей на те, которые присваивают числовые значения и строковые / массивы и т.п... чесно, глубокий смысл этих методов понятен только человеку их написавшему...

Air_mAn 13.10.2008 17:48

Цитата:

Сообщение от wvxvw (Сообщение 770072)
Не знаю, я бы просто оверрайдил setStyle и getStyle, а муть с инициализацией, ИМО, никому не нужна... с таким же успехом можно было бы еще разделить переназначение стилей на те, которые присваивают числовые значения и строковые / массивы и т.п... чесно, глубокий смысл этих методов понятен только человеку их написавшему...

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

wvxvw 13.10.2008 17:57

Как-то неубедительно =) особенно в свете того, что речь идет об компонентах mx :)


Часовой пояс GMT +4, время: 19:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.