Не уверен, что я понимаю все вышеизложенное в вашей логике кода, хотя понимаю ее назначение. ; -)
Однако, полагаясь только на styleChanged (), у меня ничего не вышло. Особенно, если я переключал стили CSS во время выполнения, и в новом объявлении стиля не было "axisStroke" - что, конечно, не может! Более полное решение будет включать код для styleChanged (), а также stylesInitialized (). В источник я также включил ссылку на объект обводки _axisStroke. Это сокращает количество вызовов getStyle ("axisStroke"), а также является необходимым для приведенной ниже логики гарантированной реализации.
Как я уже сказал, моя проблема заключалась в том, что я получал бы ошибки во время выполнения, если бы я объявил запись стиля в CSS для компонента средства визуализации оси, но не установил его свойство стиля "axisStroke" программно. Хотя обходным путем для этого обычно является создание экземпляра CSSStyleDeclaration по умолчанию в статическом методе classConstructed () (см. Руководство разработчика Adobe и стили для этой общей практики), это не будет работать, если стиль CSS динамически изменяется во время выполнения. ClassConstructed () вызывается только вначале и обычно проверяет, нет ли уже декларации стиля для компонента перед регистрацией по умолчанию. Затем, когда вы меняете стили, стиль вашего компонента «axisStroke» очищается. ПОТОМ, вы можете получить нулевые исключения. Кроме того, просто используя CSS, вы не можете вставить новый стиль "axisStroke". Но, так как stylesInitialized () вызывается в любое время, когда изменяется настройка селектора стиля компонента - например, StyleManager.setStyleDeclaration («MyComponent», myStyleDeclaration) - вы можете убедиться, что все стили установлены и находятся на своем месте, а также все, что может выдавать ноль исключение, такое как отсутствующий стиль "axisStroke", может быть учтено.
private var _axisStroke:IStroke;
override public function stylesInitialized():void {
super.stylesInitialized();
_axisStroke = getStyle("axisStroke");
if (!_axisStroke) {
//usually a default stroke style is set in a default CSSStyleDeclaration
//created in a classConstructed() method
_axisStroke = new Stroke(0xCCDDEE, 8, 1, false, LineScaleMode.NORMAL, CapsStyle.NONE);
//note: I do NOT register _axisStroke to the style "axisStroke".
//Since "axisStroke" is still technically not set, I leave it null.
//You may need to set it, however, if you are extending AxisRenderer.
//setStyle("axisStroke", _axisStroke);
}
var axisColor:Number = getStyle("axisColor");
if (!isNaN(axisColor)) {
Object(_axisStroke).color = axisColor;
}
...
}
В любом случае, если у вас просто работает styleChanged (), отлично. Но если вы по-прежнему получаете ошибки времени выполнения из-за того, что стили не инициализированы или имеют неправильный порядок, изучите использование stylesInitialized (). Это особенно полезно при создании собственных классов IAxisRenderer.