2013-03-03 47 views
2

我閱讀有關的附加屬性和我剛讀,他們可以用類似的東西進行以下設置:如何設置附加屬性的程序設計工作?

Grid.SetRow(myElement, 0); 

如果這是一個靜態方法,請問現在Grid.SetRow()其中Grid應該把myElement進?或者它以某種方式將myElement與第0行相關聯,所以當有新的Grid對象(包括myElement)時,它可以檢查myElement應該轉到哪一行?

回答

2

設置附加屬性時,該值僅存儲在元素中,而不是附加屬性所屬的類型。

例如,附列屬性來實現這樣的:

public static readonly DependencyProperty RowProperty = ...; 

public static void SetRow(UIElement element, int value) 
{ 
    element.SetValue(RowProperty, value); 
} 

public static int GetRow(UIElement element) 
{ 
    return (int)element.GetValue(RowProperty); 
} 

所以,當你調用Grid.SetRow,則內部element.SetValue被調用。由於element是一個依賴對象,因此它可以存儲這些附加屬性。您可以將其想象爲依賴對象內部的Dictionary<DependencyProperty, object>(儘管實際上它更加複雜),您可以使用SetValueGetValue訪問它。

所以該值只存儲在依賴對象本身內部。現在,當網格呈現自身時,它將遍歷其子節點以調用其測量和佈局例程。它還會爲每個孩子調用Grid.GetRow來查看是否設置了附加的行屬性,並相應地在其自己的佈局階段中尊重這些選擇。

+0

到底是什麼'IsBubbleSource'?它如何連接到'RowProperty'? – hattenn 2013-03-03 23:28:47

+1

@hattenn對不起,從手冊複製/粘貼樣板代碼(我不記得那些,在Visual Studio中有一個很棒的''propa'片段:P),並且在更改名稱時錯過了這些代碼。 – poke 2013-03-03 23:30:29

+0

沒問題:)謝謝你的好評! – hattenn 2013-03-03 23:31:52

1

如果這是一個靜態方法,Grid.SetRow()現在應該如何將Grid放入myElement中?

它不知道

或者它的工作方式,它以某種方式myElement 0行相關聯,所以當有包括myElement一個新的網格對象,它可以只檢查在哪一行myElement應該去?

是的,沒錯