1

我在圍繞與其主機組件有關的spark皮膚類中纏繞我的頭時遇到問題。基本上,從我所見過的大多數Flex 4框架中的每個皮膚都看不到在主機組件中動態設置的屬性。相反,他們定義暴露於外觀類的狀態,以定義組件外觀的不同。當你有一個非常簡單的組件和一組標準的狀態時,這是非常好的,而且當你有20個不同的屬性(假設)設置在你的主機組件中,應該改變皮膚的外觀時,它可能非常快速地變得非常複雜。將屬性暴露給Spark皮膚類

我已經看到他們用來解決這個問題的方式是通過覆蓋commit屬性和無效的外觀類中的函數,從那裏獲取他們想要的屬性的值,然後將它們設置爲本地實例化皮膚類中的變量。這很好,但我覺得這只是一個補丁解決方法,它使事情變得比需要的複雜得多。

這是我的問題: 有沒有什麼辦法可以直接從主機組件類暴露一個可綁定的屬性,所以當你定義你的皮膚類時,它可以直接讀取?假設你有一個自定義按鈕,其布爾屬性爲'selected'。在皮膚類中,您希望爲屬性'selected'添加get和set函數,以便您可以在皮膚設置時對其執行一些操作。你如何告訴皮膚類,這是你可以從主機組件中使用的一個可用屬性?

回答

5

這個問題存在於一個非常理論的層面。我不清楚你想要完成什麼,也不知道你在組件類上設置了什麼樣的屬性。我懷疑,如果您有20個屬性,並且每個屬性都需要以某種方式關聯到不同的皮膚狀態,那麼就存在體系結構問題。

但是,我可以嘗試回答你的具體問題。

Is there any way to directly expose a bindable property from the 

主機組件類,所以當你定義你的皮膚類是直接 準備從讀?

構建Flex MobileSkins時,他們建議創建一個名爲hostComponent的屬性,該屬性爲外觀類提供對組件類的引用。 MXML皮膚已經有一個similar property。如果您使用自定義外觀,則使用HostComponent元數據自動創建此屬性。因此,從外觀類可以使用hostComponent屬性訪問組件類的屬性。

比方說你有一個自定義按鈕,其布爾屬性爲 'selected'。在皮膚類中,您想添加一個get,併爲屬性'selected'設置 函數,這樣您就可以在皮膚設置時對皮膚執行一些動作 。

我不打算想要這樣做的情況。一般來說,您不會在您希望在外觀類的實例上明確更改的外觀類上定義任何屬性。

當屬性更改時,您可以從組件類派發事件。 [這很常見]。然後使用hostComponent屬性在外觀類中偵聽該事件,並在那裏更改事件。

還有一種方法可以從組件類中訪問皮膚類實例。因此,您可以使用skin屬性直接在皮膚類上更改屬性。

我不會按照任何一種方法思考它。理想情況下,組件類和皮膚類應該相互封裝;每種方法都會提供依賴性。

+0

謝謝你試圖解決這個模糊的問題!哈哈......雖然通過提及HostComponent元數據標籤來敲擊頭部......基本上我試圖做的是從主機組件訪問屬性並根據它的值在皮膚上執行操作... I在我的MXML中添加了hostcomponent標籤,但是我錯誤地認爲元數據主機組件標籤會直接將我的主機組件的屬性公開給皮膚......它沒有點擊它只給出一個-reference-它被調用'主機組件',將公開我想要的屬性 –

+0

順便說一句,你完成這項任務的其他過程也是非常好的想法以及我知道的,但它不是點擊,那就是如何實現這些過程 –

0

當你影響皮膚的成分,你可以使用元標籤的參考存儲你實際使用的皮膚部分:

[SkinPart(required="false")] 
public var resizeHandle:UIComponent; 

然後,覆蓋partAddedpartRemoved方法時,您將能夠設置或取消設置這些外觀部件中的任何內容,從基本屬性到事件偵聽器。

override protected function partAdded(partName:String, instance:Object):void 
{ 
    super.partAdded(partName, instance); 

    if (instance == resizeHandle) { 
      resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN, resizeHandle_mouseDownHandler); 
    } 
} 

override protected function partRemoved(partName:String, instance:Object):void 
{ 
    if (instance == resizeHandle) { 
     resizeHandle.removeEventListener(MouseEvent.MOUSE_DOWN, esizeHandle_mouseDownHandler); 
    } 

    super.partRemoved(partName, instance); 
} 

此外,由於已存儲的參考,你的皮膚部位,你仍然可以訪問它,只要你在你的主機組件要和更新。我清楚了嗎? :-)

+0

謝謝你添加這個信息,這絕對有幫助!然而,Flextras.com正是以我需要的方式將它擊中頭部,儘管如此我必須給他答案 –