第 14 章的摘要。 絕對版面配置
注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
如同 StackLayout
, AbsoluteLayout
衍生自 Layout<View>
並繼承 Children
屬性。 AbsoluteLayout
會實作配置系統,要求程式設計人員指定其子系的位置,並選擇性地指定其大小。 這個位置是由子系的左上角所指定,相對於裝置獨立單位的 AbsoluteLayout
左上角。 AbsoluteLayout
也會實作比例定位和重設大小功能。
AbsoluteLayout
只有當程式設計人員可以對子系(例如 BoxView
元素)施加大小,或元素的大小不會影響其他子系的位置時,才應被視為特殊用途的配置系統。 HorizontalOptions
和 VerticalOptions
屬性對的AbsoluteLayout
子系沒有任何影響。
本章也介紹附加可系結屬性的重要功能,允許在一個類別中定義的屬性(在此案例AbsoluteLayout
中)附加至另一個類別(子系)。AbsoluteLayout
程序代碼中的 AbsoluteLayout
您可以使用標準方法將子系加入 至 Children
的AbsoluteLayout
集合,但也AbsoluteLayout
提供擴充Add
方法,讓您指定 Rectangle
。Add
另一Point
個Add
方法只需要 ,在此情況下,子系不受限制且大小本身。
您可以使用需要四個值的建構函式來建立值,前兩個Rectangle
表示子系相對於其父系的位置,而第二個表示子系大小。 或者,您可以使用需要 Point
和 Size
值的建構函式。
這些Add
方法會在 AbsoluteDemo 中示範,它會使用Rectangle
值來放置BoxView
元素,以及Label
只Point
使用 值的專案。
ChessboardFixed 範例使用 32 BoxView
個元素來建立棋盤模式。 程式會 BoxView
為元素提供35單位平方的硬式編碼大小。 AbsoluteLayout
的 和 HorizontalOptions
VerticalOptions
已設定為 LayoutOptions.Center
,導致 AbsoluteLayout
的總大小為280個單位平方。
附加的可系結屬性
您也可以使用靜態方法AbsoluteLayout.SetLayoutBounds
,在 將 子系AbsoluteLayout
加入至Children
集合之後,選擇性地設定位置,並選擇性地設定子系的大小。 第一個自變數是子系;第二個 Rectangle
是物件。 您可以將寬度和高度值設定為 AbsoluteLayout.AutoSize
常數,以水準和/或垂直方式指定子系大小本身。
ChessboardDynamic 範例會使用 處理程式將 放入 AbsoluteLayout
,SizeChanged
ContentView
以呼叫AbsoluteLayout.SetLayoutBounds
所有子系,使其盡可能大。
定義的附加可系結屬性AbsoluteLayout
是名為AbsoluteLayout.LayoutBoundsProperty
的BindableProperty
靜態只讀欄位。 靜態 AbsoluteLayout.SetLayoutBounds
方法是藉由使用 SetValue
呼叫 子系 AbsoluteLayout.LayoutBoundsProperty
來實作。 子系包含一個字典,其中附加的可系結屬性及其值會儲存在字典中。 在版面配置期間, AbsoluteLayout
可以藉由呼叫 AbsoluteLayout.GetLayoutBounds
來實 GetValue
作 ,以取得該值。
比例重設大小和定位
AbsoluteLayout
會實作比例重設大小和定位功能。 類別會使用相關的靜態方法和 AbsoluteLayout.SetLayoutFlags
AbsoluteLayout.GetLayoutFlags
定義第二個附加的可系結屬性 LayoutFlagsProperty
。
的 自變數 AbsoluteLayout.SetLayoutFlags
和 的傳回值 AbsoluteLayout.GetLayoutFlags
是 型 AbsoluteLayoutFlags
別 的值,具有下列成員的列舉:
None
(等於 0)XProportional
(1)YProportional
(2)PositionProportional
(3)WidthProportional
(4)HeightProportional
(8)SizeProportional
(12)All
(\xFFFFFFFF)
您可以將這些專案與 C# 位 OR 運算子結合。
設定這些旗標之後,配置界限結構的特定屬性 Rectangle
會按比例解譯子系。
WidthProportional
設定旗標時,Width
值為 1 表示子系的寬度與 AbsoluteLayout
相同。 類似的方法用於高度。
比例定位會將大小納入考慮。 XProportional
設定旗標時,版X
面配置界限的 Rectangle
屬性會成正比。 值為 0 表示子系的左邊緣位於 的左邊緣AbsoluteLayout
,但 1 的位置表示子系的右邊緣位於 的右邊緣,而不是如您所預期的那樣位於 的右邊緣AbsoluteLayout
AbsoluteLayout
。 X
0.5 的 屬性會將子系水準置中AbsoluteLayout
。
ChessboardProportional 範例示範如何使用比例重設大小和定位。
使用比例座標
有時候,比較容易想出比例定位的方式與 在 中 AbsoluteLayout
實作的方式不同。 您可能偏好使用比例座標,其中 X
1的屬性會將子系左邊緣(而非右邊緣)與的右邊緣 AbsoluteLayout
置中。
這個替代定位配置可以稱為「小數子座標」。您可以從小數子座標轉換成使用下列公式所需的 AbsoluteLayout
版面設定界限:
layoutBounds.X = (fractionalChildCoordinate.X / (1 - layoutBounds.Width))
layoutBounds.Y = (fractionalChildCoordinate.Y / (1 - layoutBounds.Height))
ProportionalCoordinateCalc 範例會示範這一點。
AbsoluteLayout 和 XAML
您可以在 XAML 中使用 AbsoluteLayout
,並使用 和AbsoluteLayout.LayoutFlags
的屬性值AbsoluteLayout.LayoutBounds
,在 的AbsoluteLayout
子系上設定附加的可繫結屬性。 這在 AbsoluteXamlDemo 和 ChessboardXaml 範例中示範。 後者的程式包含 32 BoxView
個元素,但使用包含 屬性的AbsoluteLayout.LayoutFlags
隱含Style
專案,將標記保持在最小值。
XAML 中由類別名稱、點和屬性名稱所組成的屬性一律是附加的可系結屬性。
覆蓋
您可以使用 AbsoluteLayout
來建構 覆迭,其涵蓋頁面與其他控件,或許可以保護用戶與頁面上的一般控件互動。
SimpleOverlay 範例示範這項技術,也會示範 ProgressBar
,其會顯示程式已完成工作的範圍。
一些樂趣
DotMatrixClock 範例會以仿真的 5x7 點矩陣顯示來顯示目前的時間。 每個點都是一個 BoxView
(其中有 228 個)大小,並放置在 上 AbsoluteLayout
。
BouncingText 程式會以動畫顯示兩Label
個物件,以水準和垂直方式跨螢幕彈跳。