Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.10.2008, 11:52
romantique вне форума Посмотреть профиль Отправить личное сообщение для romantique Найти все сообщения от romantique
  № 1  
Ответить с цитированием
romantique

Регистрация: Jul 2007
Сообщений: 44
По умолчанию Кастомные стили 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.
__________________
hell no !


Последний раз редактировалось romantique; 13.10.2008 в 11:54.
Старый 13.10.2008, 14:12
Air_mAn вне форума Посмотреть профиль Отправить личное сообщение для Air_mAn Найти все сообщения от Air_mAn
  № 2  
Ответить с цитированием
Air_mAn
 
Аватар для Air_mAn

Регистрация: Apr 2008
Сообщений: 102
Цитата:
Сообщение от romantique Посмотреть сообщение
Я понимаю работу со стилями неправильно? Как стиль borderSkin может примениться к компоненте, если он никогда не проходил через методstyleChanged()? И как мне заставить мой "someStyle" примениться к моей компоненте ?
До того как высчитаются реальные размеры компонента и он отрисуется, выполняется начальная инициализация стилей и автоматически вызывается метод stylesInitialized(). Чтобы сразу после инициализации обработать свой стиль, отнаследуйтесь от компонента и переопределите этот метод.

Старый 13.10.2008, 14:29
romantique вне форума Посмотреть профиль Отправить личное сообщение для romantique Найти все сообщения от romantique
  № 3  
Ответить с цитированием
romantique

Регистрация: Jul 2007
Сообщений: 44
Этот метод применяется для доступа к стилям раньше вызовов measure() и updateDisplayList(...). Мне же нужно правильно передать стили из CSS в компоненту, и отследить изменения. Не понимаю, почему styleChanged() не срабатывает. И честно гвооря абсолютно не понял какое отношение метод stylesInitialized() имеет к моей проблеме.
__________________
hell no !

Старый 13.10.2008, 14:55
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Из того, что я понял... нужно вызвать setStyle() у компонента, а не у стиля, тогда работает, как и ожидалось, вот только как отреагировать на присвоение другого класса (а не изменения отдельного свойства) я тож, если чесно, так и не понял =)
Не знаю, умом это не понять... а зачем это все было нужно?
И вообще не понял, зачем нужен styleChanged если можно спокойно оверрайдить setStyle и при этом будут все нужные данные, да и понятнее это как-то...
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 13.10.2008 в 15:00.
Старый 13.10.2008, 15:14
romantique вне форума Посмотреть профиль Отправить личное сообщение для romantique Найти все сообщения от romantique
  № 5  
Ответить с цитированием
romantique

Регистрация: Jul 2007
Сообщений: 44
О логичности свои действий спорить не стану) Эт я вычитал в Adobe Create and Extend Flex Components... Честно говоря я был бы рад, если б мне дали какой то нормальный туториал о том, как правильно делать то, чего я хочу
__________________
hell no !

Старый 13.10.2008, 15:30
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Так а что собственно нужно сделать? Если чесно, на сколько я понял назначение styleChanged(), то это нужно для того, чтобы, скажем, вы создаете компонент, описываете стили, которые ему можно назначить, а в этом методе можно прореагировать на их добавление (т.е. скорее всего стили будут назначать пользователи вашего компонента, а не вы сами). Но, опять же, можно было легко обойтись setStyle()... Как бы я имел в виду логичность того, что происходит во фреймворке, а не этот конкретный пример =)
__________________
Hell is the possibility of sanity

Старый 13.10.2008, 16:06
Air_mAn вне форума Посмотреть профиль Отправить личное сообщение для Air_mAn Найти все сообщения от Air_mAn
  № 7  
Ответить с цитированием
Air_mAn
 
Аватар для Air_mAn

Регистрация: Apr 2008
Сообщений: 102
Цитата:
Сообщение от romantique Посмотреть сообщение
Не понимаю, почему 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() который полезен при смене стилей.

Старый 13.10.2008, 16:57
romantique вне форума Посмотреть профиль Отправить личное сообщение для romantique Найти все сообщения от romantique
  № 8  
Ответить с цитированием
romantique

Регистрация: Jul 2007
Сообщений: 44
А как правильнее задать дефолтные значение моим стилям? От-оверрайдить stylesInitialized() и поставить туда setStyle()'ы ?

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

А то начитался Adobe доков, а тут другое советуют
__________________
hell no !

Старый 13.10.2008, 17:18
Air_mAn вне форума Посмотреть профиль Отправить личное сообщение для Air_mAn Найти все сообщения от Air_mAn
  № 9  
Ответить с цитированием
Air_mAn
 
Аватар для Air_mAn

Регистрация: Apr 2008
Сообщений: 102
Цитата:
Сообщение от romantique Посмотреть сообщение
А как правильнее задать дефолтные значение моим стилям? От-оверрайдить 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)
		}

Старый 13.10.2008, 17:23
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Не знаю, я бы просто оверрайдил setStyle и getStyle, а муть с инициализацией, ИМО, никому не нужна... с таким же успехом можно было бы еще разделить переназначение стилей на те, которые присваивают числовые значения и строковые / массивы и т.п... чесно, глубокий смысл этих методов понятен только человеку их написавшему...
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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