Я создаю новый компонент Flex (Flex 3). Я бы хотел, чтобы у него был стиль по умолчанию. Есть ли соглашение об именах или что-то для моего файла .cs, чтобы сделать его стандартным? Я что-то пропустил?
Как определить стиль по умолчанию для настраиваемого компонента Flex?
Ответ 1
Два способа, в общем. Например, если вы создали новый класс компонентов MyComponent
в ActionScript или косвенно, добавив компонент MXML, расширяющий другой UIComponent с именем MyComponent
, в обоих случаях компонент будет отображать стили, объявленные в вашей внешней таблице стилей, при условии, что таблица стилей была импортирована в ваше приложение (например, через Style source
):
MyComponent
{
backgroundColor: #FFFFFF;
}
Другой способ - установить свойство UIComponent styleName
(в виде строки):
public class MyComponent
{
// ...
this.styleName = "myStyle";
// ...
}
... и определяя стиль в файле CSS так (обратите внимание на точечную нотацию):
.myStyle
{
backgroundColor: #FFFFFF;
}
Имеют смысл?
Ответ 2
Христианское право на применение CSS, но если вы планируете использовать компонент в библиотеке по проектам, вы захотите написать файл css по умолчанию для этой библиотеки. Вот как вы это делаете:
- Создайте css файл с именем "defaults.css" (будет работать только это имя!) и поместите его на верхний уровень в папке "src" вашей библиотеки. Если файл css ссылается на какие-либо активы, они также должны находиться под "src".
- (ВАЖНО!) Перейдите в проект библиотеки Properties > Flex Build Build Path > Assets и включите файл css и все активы.
То, как команда Adobe устанавливает все свои стили по умолчанию, теперь вы можете это сделать. Просто понял это - огромный
Ответ 3
В дополнение к тому, что предложил Христиан Нунциато, другой вариант - определить статический инициализатор для ваших стилей компонентов Flex. Это позволяет устанавливать стили по умолчанию, не требуя от разработчика добавления файла CSS.
private static function initializeStyles():void
{
var styles:CSSStyleDeclaration = StyleManager.getStyleDeclaration("ExampleComponent");
if(!styles)
{
styles = new CSSStyleDeclaration();
}
styles.defaultFactory = function():void
{
this.exampleNumericStyle = 4;
this.exampleStringStyle = "word to your mother";
this.exampleClassStyle = DefaultItemRenderer //make sure to import it!
}
StyleManager.setStyleDeclaration("ExampleComponent", styles, false);
}
//call the static function immediately after the declaration
initializeStyles();
Ответ 4
Уточнение того, что предложил жоштыняла:
public class CustomComponent extends UIComponent {
private static var classConstructed:Boolean = classConstruct();
private static function classConstruct():Boolean {
if (!StyleManager.getStyleDeclaration("CustomComponent")) {
var cssStyle:CSSStyleDeclaration = new CSSStyleDeclaration();
cssStyle.defaultFactory = function():void {
this.fontFamily = "Tahoma";
this.backgroundColor = 0xFF0000;
this.backgroundAlpha = 0.2;
}
StyleManager.setStyleDeclaration("CustomComponent", cssStyle, true);
}
return true;
}
}
Я читал это в документах где-то; метод classContruct вызывается автоматически.
Ответ 5
Вы можете переопределить стили по умолчанию с помощью тега <fx:Style>
или аналогичного. Если это так, CSSStyleDeclaration может уже существовать с помощью класса timeConstructed. Здесь решение:
private static var classConstructed:Boolean = getClassConstructed ();
private static function getClassConstructed ():Boolean {
var defaultCSSStyles:Object = {
backgroundColorGood: 0x87E224,
backgroundColorBad: 0xFF4B4B,
backgroundColorInactive: 0xCCCCCC,
borderColorGood: 0x333333,
borderColorBad: 0x333333,
borderColorInactive: 0x666666,
borderWeightGood: 2,
borderWeightBad: 2,
borderWeightInactive: 2
};
var cssStyleDeclaration:CSSStyleDeclaration = FlexGlobals.topLevelApplication.styleManager.getStyleDeclaration ("StatusIndicator");
if (!cssStyleDeclaration) {
cssStyleDeclaration = new CSSStyleDeclaration ("StatusIndicator", FlexGlobals.topLevelApplication.styleManager, true);
}
for (var i:String in defaultCSSStyles) {
if (cssStyleDeclaration.getStyle (i) == undefined) {
cssStyleDeclaration.setStyle (i, defaultCSSStyles [i]);
}
}
return (true);
}
Ответ 6
Чтобы создать стиль по умолчанию, вы также можете иметь свойство в своем классе и переопределить функцию styleChanged() в UIComponent, например, чтобы рисовать только цвет фона на половине ширины компонента:
// this metadata helps flex builder to give you auto complete when writing
// css for your CustomComponent
[Style(name="customBackgroundColor", type="uint", format="color", inherit="no")]
public class CustomComponent extends UIComponent {
private static const DEFAULT_CUSTOM_COLOR:uint = 0x00FF00;
private var customBackgroundColor:uint = DEFAULT_CUSTOM_COLOR;
override public function styleChanged(styleProp:String):void
{
super.styleChanged(styleProp);
var allStyles:Boolean = (!styleProp || styleProp == "styleName");
if(allStyles || styleProp == "customBackgroundColor")
{
if(getStyle("customBackgroundColor") is uint);
{
customBackgroundColor = getStyle("customBackgroundColor");
}
else
{
customBackgroundColor = DEFAULT_CUSTOM_COLOR;
}
invalidateDisplayList();
}
// carry on setting any other properties you might like
// check out UIComponent.styleChanged() for more examples
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
graphics.clear();
graphics.beginFill(customBackgroundColor);
graphics.drawRect(0,0,unscaledWidth/2,unscaledHeight);
}
}
Вы также можете создать установщик для customBackgroundColor, который вызвал invalidateDisplayList(), чтобы вы могли также установить свойство customBackgroundColor программно, а также через css.