Dot-Net

自定義 DependencyObject 繼承樹

  • December 18, 2015

我正在努力尋找有關 and 使用的屬性繼承樹(或繼承上下文)的足夠DependencyObject資訊DependencyProperty

我想使用DependencyProperty典型 WPF 頁面之外的值繼承功能,例如對象 A 是邏輯父對象 B,因此分配給對象 A 上的屬性的值將自動傳播到對象 B,除非它已經在本地設置(有點像FlowDirectionWPF 中的屬性)。

如果 Object A 和 Object B 派生自DependencyObject,並且不是a 的子級UIElement (換句話說,Object A 是它自己的),那麼您如何建立邏輯樹以便DependencyProperty理解 B 是 A 的子級?

Hillberg Freezable Trick以及Josh Smith 的技巧包並不是我想要的。我不想從現有元素樹中檢索屬性…我想創建自己的非可視元素樹…即控制繼承上下文。

有誰知道這個知識體系隱藏在哪裡?

經過大量研究和混淆原始碼後DependencyObject,以下是簡短答案:

InheritenceContext顯示實例的邏輯父級的屬性)(就像 90% 的有用實現DependencyObject一樣)標記為內部,因此對 WindowsBase.dll 之外的所有程式碼都隱藏

可以使用反射來設置_contextParent欄位,也可以呼叫這個隱藏的方法來設置InheritenceContext,但歸根結底,它不是一個乾淨的解決方案。

在搜尋了DependencyObject原始碼之後,我不得不說我沒有留下深刻的印象。DependencyObject可以而且應該是一個非常乾淨、無處不在、可重用的類。相反,它在結構上和行為上都綁定到它的繼承者,甚至包含特定的常量、欄位、方法和解決方法,以幫助 Freezable 與其他子類共存,這不僅與良好的 OO 設計相去甚遠,而且還使一個其他出色的類在 WPF 框架之外完全無法使用。

引用自:https://stackoverflow.com/questions/614624