第12章 樣式(三)

2021-09-20 04:54:14 字數 2086 閱讀 2074

style的targettype提供兩種不同的功能:下一節隱式樣式中描述了其中一種功能。 另乙個函式是為了xaml解析器的好處。 xaml解析器必須能夠解析setter物件中的屬性名稱,並且為此需要targettype提供的類名。

樣式中的所有屬性必須由target?type屬性中指定的類定義或繼承。 設定style的可視元素的型別必須與targettype或targettype的派生類相同。

如果只需要為view定義的屬性設定樣式,則可以將targettype設定為view,並仍然使用按鈕上的樣式或任何其他view派生,如在basicstyle程式的此修改版本中:

如您所見,相同的樣式應用於stacklayout的所有button和label子項:

但是假設你現在想要擴充套件這種風格,但對於button和label則不同。那可能嗎?

是的。樣式可以源自其他樣式。 style類包含乙個名為basedon的屬性style。在**中,您可以將此basedon屬性直接設定為另乙個style物件。在xaml中,將basedon屬性設定為引用先前建立的樣式的staticresource標記擴充套件。新樣式可以包含新屬性的setter物件,或者使用它們覆蓋早期樣式中的屬性。 basedon樣式必須以新樣式targettype的相同類或祖先類為目標。

這是名為styleinheritance的專案的xaml檔案。該應用程式有兩個目的引用xamarin.formsbook.toolkit程式集:它使用hslcolor標記擴充套件來證明標記擴充套件是setter物件中的合法值設定,並且可以證明可以為自定義類定義樣式,在這種情況下altlabel。

resourcedictionary包含四種樣式:第一種具有「visualstyle」的字典鍵。帶有「basestyle」字典鍵的style來自「visualstyle」。帶有「la?belstyle」和「buttonstyle」鍵的樣式來自「basestyle」:

因為page派生自visualelement而不是view,所以這是可以應用於頁面的資源詞典中的唯一樣式。 但是,在re?sources部分之後才能將樣式應用於頁面,因此使用staticresource的元素形式是乙個很好的解決方案。 頁面的整個背景基於此樣式著色,並且樣式也由所有其他樣式繼承:

如果altlabel的樣式僅包含label定義的屬性的setter物件,則targettype可以是label而不是altlabel。但style具有pointsize屬性的setter。該屬性由altlabel定義,因此targettype必須是toolkit:altlabel。

可以為pointsize屬性定義setter,因為pointsize由可繫結屬性支援。如果將altlabel中bindableproperty物件的可訪問性從公共更改為私有,則該屬性仍可用於altlabel的許多常規用法,但現在pointsize可以不在樣式setter中設定。 xaml解析器會抱怨它無法找到pointsizeproperty,它是支援pointsize屬性的可繫結屬性。

您在第10章中發現了staticresource的工作原理:當xaml解析器遇到staticresource標記擴充套件時,它會在視覺化樹中搜尋匹配的字典鍵。這個過程對風格有影響。您可以在乙個「資源」部分中定義樣式,然後使用可視樹中較低的「資源」部分中具有相同字典鍵的另乙個樣式覆蓋該樣式。將basedon屬性設定為staticresource標記擴充套件時,必須在相同的resources部分(如styleinheritance程式中演示)或可視樹中較高的resources部分中定義您派生的樣式。

這意味著您可以使用兩種分層方式在xaml中構建樣式:您可以使用basedon從其他樣式派生樣式,並且可以在可視樹中的不同級別定義樣式,這些樣式派生自可視樹中較高的樣式或替換它們完全。

對於具有多個頁面和大量標記的大型應用程式,定義樣式的建議非常簡單 - 將樣式定義為盡可能接近使用這些樣式的元素。

遵循此建議有助於維護程式,並在使用隱式樣式時變得特別重要。

第12章 繼承

1 單一繼承 2 多重繼承 3 繼承的賦值 1 將派生類的物件賦值給基類的物件 例如father p son s p s 會呼叫賦值運算子 將左邊物件的成員賦值給右邊物件的成員 不能將基類的物件賦值給派生類的物件,因為要呼叫賦值運算子 基類物件中沒有派生類物件自己的成員 2 基類的指標或者引用指向派...

第12章 模組 2

12.3 命名空間 命名空間是名稱 識別符號 到物件的對映。向命名空間新增名稱的操作過程涉及繫結識別符號到指定物件的操作 以及給該物件的引用計數加1 改變乙個名字的繫結叫做重新繫結,刪除乙個名字叫做解除繫結。執行期間有兩個或三個活動的命名空間。這三個命名空間分別是區域性命名空間,全域性命名空間和內建...

程式設計珠璣第12章

正文 如何生成0 n 1內的m個隨機整數 1 方法一 比如要從5個數里選出2個數,第乙個數的概率是2 5,第二個數的概率是1 4,然後是0 3 那麼現在已經很清楚了。可以寫 如下 for int i 0 i n i if rand n i m 2 方法二 可以用乙個set,每生成乙個隨機,就去set...