DependencyObject 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
代表參與相依性屬性系統的物件。
public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DependencyObject
Public Class DependencyObject
- 繼承
- 衍生
- 屬性
範例
這個範例會定義衍生自 DependencyObject的類別,並定義附加屬性以及標識符欄位。 此類別的案例是,它是一個服務類別,宣告附加屬性,其他UI元素可以在 XAML 中設定。服務可能會在運行時間對這些UI元素的附加屬性值採取動作。
public abstract class AquariumServices : DependencyObject
{
public enum Buoyancy { Floats, Sinks, Drifts }
public static readonly DependencyProperty BuoyancyProperty = DependencyProperty.RegisterAttached(
"Buoyancy",
typeof(Buoyancy),
typeof(AquariumServices),
new PropertyMetadata(Buoyancy.Floats)
);
public static void SetBuoyancy(DependencyObject element, Buoyancy value)
{
element.SetValue(BuoyancyProperty, value);
}
public static Buoyancy GetBuoyancy(DependencyObject element)
{
return (Buoyancy)element.GetValue(BuoyancyProperty);
}
}
public static bool ClearSetProperty(DependencyObject targetObject, DependencyProperty targetDP)
{
if (targetObject == null || targetDP == null)
{
throw new ArgumentNullException();
}
object localValue = targetObject.ReadLocalValue(targetDP);
if (localValue == DependencyProperty.UnsetValue)
{
return false;
}
else
{
targetObject.ClearValue(targetDP);
return true;
}
}
此範例示範簡單的相依性屬性宣告。
對 GetValue 的get呼叫會構成新相依性屬性之屬性包裝函式的整個存取子實作。
對 SetValue 的呼叫會構成存取子實作的set整個。 如需更多範例,請參閱 自定義相依性屬性。
public class Fish : Control
{
public static readonly DependencyProperty SpeciesProperty =
DependencyProperty.Register(
"Species",
typeof(String),
typeof(Fish), null
);
public string Species
{
get { return (string)GetValue(SpeciesProperty); }
set { SetValue(SpeciesProperty, (string)value); }
}
}
備註
類別 DependencyObject 會在其許多衍生類別上啟用相依性屬性系統服務,而且是許多重要UI相關類別的立即基類,例如 UIElement、 Geometry、 FrameworkTemplate、 Style和 ResourceDictionary。 如需如何 DependencyObject 支援相依性屬性的詳細資訊,請參閱 相依性屬性概觀。
相依性屬性系統的主要函式是計算屬性值,並提供已變更之值的系統通知。 參與相依性屬性系統的另一個主要類別是 DependencyProperty。
DependencyProperty 可讓相依性屬性註冊至屬性系統,而 DependencyObject 基類可讓物件使用和設定相依性屬性。
以下是 DependencyObject 提供或支援的一些值得注意的服務與特性:
- 現有相依性屬性的相依性屬性裝載支援 Windows 執行階段 相依性屬性。
- 自訂相依性屬性裝載支援。 您可以呼叫 Register 方法,並將方法的傳回值儲存為類別
DependencyObject中的公用靜態屬性,以註冊相依性屬性。 - 附加屬性裝載現有 Windows 執行階段 附加屬性的支援。
- 自訂附加屬性裝載支援。 您可以呼叫 RegisterAttached 方法,並將方法的傳回值儲存為類別中的公用靜態屬性,以註冊附加屬性使用方式的相依性屬性。
-
Get和Set公用程式方法,用於存在於 上DependencyObject之任何相依性屬性的值。 您可以在定義自定義相依性屬性 包裝 函式時使用這些包裝函式,也可以從應用程式程式代碼使用這些包裝函式,作為使用現有 包裝函 式屬性的替代方案。 - 用於檢查元數據或屬性值 (的進階案例公用程式,例如 GetAnimationBaseValue) 。
- 針對所有
DependencyObject實例,對 Windows 執行階段 的主要UI線程強制執行線程親和性。 - 進階線程案例的 DispatcherQueue 屬性。
DispatcherQueue可讓背景工作線程執行使用DependencyObject但不在UI線程上的程式碼,因為它可以將執行延遲到不會封鎖或干擾UI線程的異步操作。 See "DependencyObjectand threading" section below. - 基本數據系結和樣式支援,方法是讓屬性設定為表達式,以便在物件存留期稍後的某個時間點進行評估。 相 依性屬性概觀中會更詳細地說明這些概念。 另請參閱 深入的數據系結。
DependencyObject 和線程處理
所有 DependencyObject 實例都必須在與應用程式目前 視窗 相關聯的 UI 線程上建立。 這是由系統強制執行,這對您的程式代碼有兩個重要影響:
- 從兩
DependencyObject個實例使用 API 的程式代碼一律會在相同的線程上執行,也就是一律是 UI 線程。 在此案例中,您通常不會遇到線程問題。 - 未在主要 UI 線程上執行的程式代碼無法直接存取 ,
DependencyObjectDependencyObject因為 只有 與 UI 線程具有線程親和性。 只有在 UI 線程上執行的程式代碼可以變更或甚至讀取相依性屬性的值。 例如,您使用 .NET 工作 或明確 ThreadPool 線程起始的背景工作線程將無法讀取相依性屬性或呼叫其他 API。
您不會完全封鎖從背景工作線程使用 DependencyObject 。 但是您必須取得 DispatcherQueue 物件, (DependencyObject.DispatcherQueue 的值) , DependencyObject 才能在應用程式 UI 線程與系統上執行的任何其他線程之間刻意分隔。 會 DispatcherQueue 公開 TryEnqueue 方法來執行可等候的程式代碼。 由於它啟用跨線程的存取, DependencyObject.DispatcherQueue 因此 是唯一可從非UI線程存取的 DependencyObject 實例 API 或其任何子類別,而不會擲回跨線程例外狀況。 如果您嘗試從背景工作線程或任何其他非UI線程呼叫它們,所有其他 DependencyObject API 都會擲回例外狀況。
在一般 UI 程式代碼中,通常可以避免線程問題。 不過,裝置通常不會與UI線程相關聯。 如果您使用從裝置取得的信息即時更新UI,您通常必須取得 DispatcherQueue ,才能更新UI。 服務是您用來存取服務的程式代碼可能不會在UI線程上執行的另一種情況。
一個程式代碼案例,如果您在定義自己的DependencyObject類型,並嘗試將它們用於數據源,或其他DependencyObject不一定適當的 (案例,因為物件與 UI) 不直接相關,則可能會遇到DependencyObject相關的線程問題。 例如,您可能嘗試使用背景線程或其他背景線程或其他背景工作線程進行效能優化,這些線程會在呈現之前變更物件的值,或回應裝置、服務或其他外部輸入。 評估您是否真的需要案例的相依性屬性;或許標準屬性已足夠。
DependencyObject 衍生類別
DependencyObject 是數個立即衍生類別的父類別,這些類別都是您用於應用程式及其 XAML UI 之程式設計模型的基礎。 以下是一些值得注意的衍生類別:
- UIElement:可在UI中處理輸入的大部分視覺物件的基類。 FrameworkElement 在此階層中更進一步,如同 Control,因此 Windows 執行階段 中有數百個控件和其他類別,這些控件在其類別階層中都有 UIElement 類別。
- XAML 樣式系統支持類別: FrameworkTemplate (ControlTemplate、 DataTemplate、 ItemsPanelTemplate) 、 Style、 SetterBase (Setter) 、 ToolTipTemplateSettings 和其他 TemplateSettings 的父 系。
- 視覺狀態模型: Transition、 VisualState、 VisualStateGroup、 VisualStateManager、 VisualTransition。
- 數據系結支援:BindingBase (Binding) 、CollectionViewSource、PropertyPath、RelativeSource 的父系。
- 分鏡腳本動畫: 時間軸 (分鏡腳本的父系、具類型的動畫、主題動畫) 、輸入的主要畫面格 (,例如 ColorKeyFrame) 、 KeySpline、 EasingFunctionBase。
- XAML 圖形和轉譯基本類型: Brush、 Geometry、 GeneralTransform、 GradientStop、 PathFigure、 PathSegment、 Projection。
- 圖像處理和轉譯介面 Interop: ImageSource (BitmapSource、 RenderTargetBitmap、 SurfaceImageSource 和其他) 的父代。
- 視窗:代表主應用程式視窗。
- FlyoutBase (Flyout 和 MenuFlyout) 的父代。
- ResourceDictionary:在 XAML 中定義索引鍵資源。
- TextElement: Block 和 Inline 的父代,這些是 用於 TextBlock 內容或 RTF 元素之文字元素的基類。
- AutomationPeer:Microsoft 使用者介面自動化 對等的基類,代表 Microsoft 使用者介面自動化 接聽程式的 XAML 控件。 此外, IRawElementProviderSimple。
- 其他:CacheMode、ColumnDefinition、DependencyObjectCollection、InputScope、InputScopeName、PageStackEntry、PrintDocument、RowDefinition、TriggerAction、TriggerBase。
建構函式
| DependencyObject() |
提供 DependencyObject 衍生類別的基類初始化行為。 |
屬性
| Dispatcher |
一律會在 Windows 應用程式 SDK 應用程式中傳回 |
| DispatcherQueue |
|
方法
| ClearValue(DependencyProperty) |
清除相依性屬性的本機值。 |
| GetAnimationBaseValue(DependencyProperty) |
傳回針對相依性屬性所建立的任何基底值,如果動畫未使用中,則會套用。 |
| GetValue(DependencyProperty) |
從 DependencyObject 傳回相依性屬性的目前有效值。 |
| ReadLocalValue(DependencyProperty) |
如果已設定本機值,則傳回相依性屬性的本機值。 |
| RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
註冊通知函式,以接聽此 DependencyObject 實例上特定 DependencyProperty 的變更。 |
| SetValue(DependencyProperty, Object) |
在 DependencyObject 上設定相依性屬性的本機值。 |
| UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
取消先前透過呼叫 RegisterPropertyChangedCallback 註冊的變更通知。 |