1. 程式人生 > 其它 >MAUI新生3.1-深入理解XAML:附加屬性AttachedProperty

MAUI新生3.1-深入理解XAML:附加屬性AttachedProperty

可繫結屬性在宿主類上定義,並在XAML檔案中的宿主類元素上使用,我們使用的大多數屬性都是如此,如【<Grid BackgroundColor="AliceBlue"></Grid>】,附加屬性BackgroundColor在宿主類Grid上定義,並在宿主元素<Grid>上使用。附加屬性也是可繫結屬性,在宿主類的定義(定義方式有一些差異),但是,附加屬性在XAML檔案中的“非宿主類”上賦值使用。

一、建立和使用附加屬性的簡單案例

1、可繫結物件和附加屬定的定義

public class Shadow:ContentView
{
    //和可繫結屬性不同,這裡呼叫的是CreateAttached方法
    
//在HashTable上建立一個Hashcode和BindableProperty物件的鍵值對 public static readonly BindableProperty HasShadowProperty = BindableProperty.CreateAttached("HasShadow",typeof(bool),typeof(Shadow),false); //和可繫結屬性不同,這裡使用GetHasShadow和SetHasShadow兩個方法對屬性進行包裝(訪問屬性) //引數view為XAML檔案中,使用附加屬性的非宿主元素物件 //呼叫view的GetValue和SetValue方法進行存取值
//實際上還是在BindableProperty物件的小房間(可擴充陣列)裡存取值,但區別在於增加的非宿主元素的檢索要素 public static bool GetHasShadow(BindableObject view) { return (bool)view.GetValue(HasShadowProperty); } public static void SetHasShadow(BindableObject view,bool value) { view.SetValue(HasShadowProperty, value); } }

2、第二步:在XAML中使用使用附加屬性(注:本案例未設定控制元件的外觀,所以在UI層並不能看到控制元件)

//方法一:XAML中使用附加屬性
<VerticalStackLayout>
    <Label Text="使用HasShadow" control:Shadow.HasShadow="True"/>
</VerticalStackLayout>

//方法二:後臺程式碼中使用附加屬性
Label label = new Label { Text = "使用HasShadow" };
Shadow.SetHasShadow (label, true);

二、進一步解釋原理

  • 首先要說明的是,雖然上例中,我們使用了Shadow、HasShadow等具有意義的名稱,但僅僅通過上面的程式碼,Shadow和HasShadow並沒有實際意義,即使HasShadow等於true,元素也不會神奇的就有了陰影。上面的程式碼,僅僅是定義了一個名稱為HasShadow的屬性,然後可以給它賦值為true或false。只有我們使用控制元件模板好,使用這個屬性值來定義UI,它才具有了實際意義。
  • 如果我們從HashTable和小房間的底層原理來理解附加屬性,其實它和可繫結屬性的差異非常小,僅僅是在小房間中存取值時,檢索的房間號裡,多了非宿主元素的程式碼。比如來的房間號是301,現在變成了label.301,button.301,這樣就能識別是哪個非宿主物件在使用它,從而可以對這些非宿主物件施加UI的影響。
  • 可繫結屬性和附加屬性,本質上就是改變了存取值的方式。原來每建立一個物件,就要為所有屬性的back欄位分配記憶體空間,現在不用了,只有需要用到的屬性,才分配記憶體空間,大大節省了記憶體空間。同時,原來的資料都儲存在一個個物件裡,現在資料雖然還是分開儲存在小房間裡,但是檢索方式和存取方式都發生了根本變化,效能效率更加高。
  • 雖然附加屬性的本質和可繫結屬性是一樣的,但可以讓我們更加方便的使用XAML,可以想象,如果Grid子元素的所有Row和Column值,都在Grid上分配,一不直觀,二也更加繁瑣。