サブクラスに[Style ...]メタデータタグを追加すると、showPromptWhenFocusedにMXMLからアクセスでき、initializeStyles ()関数は、デフォルト値をtrueに正常に変更しません。祖先コンポーネントから継承されたスタイルのデフォルト値をオーバーライドしたい[flex4]
showPromptWhenFocusedを希望する場合はfalseに設定することができますが、デフォルト値をtrueにします。
package com.santacruzsoftware.crafting.controls
{
import mx.core.FlexGlobals;
import mx.styles.CSSStyleDeclaration;
import mx.styles.StyleManager;
import spark.components.TextInput;
[Style(name="showPromptWhenFocused", inherit="yes", type="Boolean")]
public class WatermarkTextInput extends TextInput
{
private static function initializeStyles() : void
{
var style : CSSStyleDeclaration = FlexGlobals.topLevelApplication.styleManager.getStyleDeclaration("showPromptWhenFocused");
if (!style)
style = new CSSStyleDeclaration();
style.defaultFactory = function() : void
{
this.showPromptWhenFocused = true;
}
FlexGlobals.topLevelApplication.styleManager.setStyleDeclaration("showPromptWhenFocused", style, false);
}
//call the static function immediately after the declaration
initializeStyles();
}
}
defaultFactoryは、MXMLでクラスをインスタンス化するときに、MXMLで設定された "defaults"を含むことを意図したものです。したがって、このファクトリはすべてのインスタンスでスタイルをオーバーライドできない場合があります。私はdefaultFactoryの代わりにfactoryをオーバーライドする方が良い結果を得ました。スタイルプロパティが含まれていない宣言が存在する可能性があるため、宣言の値を確認することができます。また、Flex 4+のすべてのUIComponentにはstylemanagerへの参照があります。 FlexGlobalsを使用する必要はありません(そうしないでください)。 –
Amy - initializeStyles()は静的なので、インスタンス内のstyleManager参照へのアクセス権はありません。 –
祖先に他のすべてのスタイルを設定させるにはどうすればよいですか?または、子孫の静的関数が実行されるときに既にそれを実行していますか? デバッグすると、スタイルがまだ設定されていないかのように、if(!style)がtrueであることがわかります。 –