2012-04-21 10 views
0

サブクラスに[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(); 
} 
} 

答えて

0

あなたはWaterMarkTextInputスタイル宣言得ることができるので、あなたは、自分のクラスの名前にgetStyleDeclaration()パスを呼び出す:

var style : CSSStyleDeclaration = FlexGlobals.topLevelApplication.styleManager.getStyleDeclaration("WatermarkTextInput"); 

をそして、あなたのクラスのスタイルを設定し、同じことを実行します。

FlexGlobals.topLevelApplication.styleManager.setStyleDeclaration("WatermarkTextInput", style, false); 
+1

defaultFactoryは、MXMLでクラスをインスタンス化するときに、MXMLで設定された "defaults"を含むことを意図したものです。したがって、このファクトリはすべてのインスタンスでスタイルをオーバーライドできない場合があります。私はdefaultFactoryの代わりにfactoryをオーバーライドする方が良い結果を得ました。スタイルプロパティが含まれていない宣言が存在する可能性があるため、宣言の値を確認することができます。また、Flex 4+のすべてのUIComponentにはstylemanagerへの参照があります。 FlexGlobalsを使用する必要はありません(そうしないでください)。 –

+0

Amy - initializeStyles()は静的なので、インスタンス内のstyleManager参照へのアクセス権はありません。 –

+0

祖先に他のすべてのスタイルを設定させるにはどうすればよいですか?または、子孫の静的関数が実行されるときに既にそれを実行していますか? デバッグすると、スタイルがまだ設定されていないかのように、if(!style)がtrueであることがわかります。 –

0

notifyStyleChangeInChildren()をオーバーライドしてください。

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 { 

     public var inheritStyles:boolean = true; 

     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(); 

     public override function notifyStyleChangeInChildren(styleProp:String, recursive:Boolean):void { 
      if (!inheritStyles) { 
       switch(styleProp) { 
        case 'showPromptWhenFocused': 
         return; 
       } 
      } 
      super.notifyStyleChangeInChildren(styleProp, recursive); 
     } 

} 
+2

回答はコードのみで構成しないでください。答えがより役立つように、あなたのコードとOPのコードとの違いを説明し、それがよりうまくいく理由を説明してください。 –

+0

申し訳ありませんが、私の英語はひどいです=) – Feanix

+0

あなたの英語は問題ないと思います。 –

関連する問題