2011-09-02 68 views
0

我有各種通過編程皮膚皮膚的組件。皮膚類引用一個單獨的類,該類包含各種顏色以應用於組件的不同方面。 singleton類的默認顏色設置爲黑/灰等變化。我從XML文件加載自定義顏色,然後加載到單例中。我通過包含在主應用程序mxml中的css樣式表應用自定義皮膚。有沒有辦法在ActionScript中以編程方式添加Flex皮膚?

問題是,當swf最初加載時,屏幕上繪製的組件是黑色的,並且不反映從XML文件加載的顏色更改。我有一些下拉窗口顯示按鈕點擊和下拉列表確實反映了XML文件中的正確顏色。因此,系統工作正常,但在XML加載並應用於單例之前,顯然會發生組件的初始繪製。

我的問題是,有沒有辦法通過調用構造函數以編程方式將皮膚應用於元素?

我有這個在我的CSS文件:

.PanControlsBackground { 
    borderSkin:ClassReference('skins.buttons.PanControlsBackground'); 
} 

和我申請的類此:

_app.panControls.styleName = "PanControlsBackground"; 

有沒有辦法來調用:

_app.panControls.styleName = new PanControlsBackground(); 

或者有什麼影響?這樣,我可以刪除在css文件中加載的皮膚,並控制它們的實例化時間,以確保在顯示各種組件之前應用正確的顏色。

回答

1

您可以使用styleManager在運行時操作樣式。例如,

.PanControlsBackground { 
    /* leave it blank */ 
} 

然後在一些腳本塊:

styleManager.getStyleDeclaration(".PanControlsBackground").setStyle("borderSkin", skins.buttons.PanControlsBackground); 

所以,這是一個綱領性的方式改變皮膚的一種方式。

但是,我不太瞭解垃圾收集是如何處理舊皮膚的。例如,GC如何在切換皮膚的方法上有所不同,而不僅僅是針對每個皮膚使用一堆不同的CSS類並在它們之間切換?我無法真正回答這個問題。

我想至少可以說上面的方法可以確保首先使用默認(或其他可能創建的最小皮膚),並且可以控制何時在初始化過程中其他皮膚被實例化。

+0

這使得既然,但它沒有爲我工作。我已經從CSS表中刪除了borderSkin並添加了以下代碼:'StyleManager.getStyleDeclaration(「。PanControlsBackground」)。setStyle(「borderSkin」,skins.buttons.PanControlsBackground);'這給了我一個「未定義的屬性」皮膚'「錯誤。所以然後我嘗試在一個ClassReference中包裝皮膚(就像在樣式表中一樣),但那也不起作用。 – swatkins

+1

@swatkins - 嘗試向腳本塊添加一條導入語句。例如'import skins.buttons.PanControlsBackground;' – merv

+0

我實際上已經把CSS表單移動到加載可見控件的內部模塊 - 這延遲了皮膚的實例化,以便應用正確的顏色。出於好奇,我嘗試了你的方法,它似乎已經奏效。非常感謝@merv! – swatkins

相關問題