DependencyObject 클래스

정의

종속성 속성 시스템에 참가하는 개체를 나타냅니다.DependencyObject는 많은 중요한 UI 관련 클래스(예: UIElement, Geometry, StyleFrameworkTemplateResourceDictionary.)의 직접 기본 클래스입니다. DependencyObject에서 종속성 속성을 지원하는 방법에 대한 자세한 내용은 종속성 속성 개요를 참조하세요.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 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(Windows.Foundation.UniversalApiContract), 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
상속
Object IInspectable DependencyObject
파생
특성

Windows 요구 사항

디바이스 패밀리
Windows 10 (10.0.10240.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v1.0에서 도입되었습니다.)

예제

이 예제에서는 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 Class AquariumServices
    Inherits DependencyObject
    Public Enum Buoyancy
        Floats
        Sinks
        Drifts
    End Enum

    Public Shared ReadOnly BuoyancyProperty As DependencyProperty = _
          DependencyProperty.RegisterAttached(
          "Buoyancy", _
          GetType(Buoyancy), _
          GetType(AquariumServices), _
          New PropertyMetadata(Buoyancy.Floats))


    Public Sub SetBuoyancy(element As DependencyObject, value As Buoyancy)
        element.SetValue(BuoyancyProperty, value)
    End Sub
    Public Function GetBuoyancy(element As DependencyObject) As Buoyancy
        GetBuoyancy = CType(element.GetValue(BuoyancyProperty), Buoyancy)
    End Function
End Class
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;
    }
}
Public Shared Function ClearSetProperty(targetObject As DependencyObject, targetDP As DependencyProperty) As Boolean
    If targetObject Is Nothing Or targetDP Is Nothing Then
        Throw New ArgumentNullException()
    End If
    Dim localValue As Object = targetObject.ReadLocalValue(targetDP)
    If localValue = DependencyProperty.UnsetValue Then
        ClearSetProperty = False
    Else
        targetObject.ClearValue(targetDP)
        ClearSetProperty = True
    End If
End Function

이 예제에서는 간단한 종속성 속성 선언을 보여줍니다. 호출 GetValue 은 새 종속성 속성의 속성 래퍼에 대한 get 접근자 구현 전체를 구성합니다. 호출 SetValueset 접근자 구현 전체를 구성합니다. 자세한 예제는 사용자 지정 종속성 속성을 참조하세요.

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); }
    }
}
Public Class Fish
    Inherits Control

    Public Shared ReadOnly SpeciesProperty As DependencyProperty = _
    DependencyProperty.Register(
    "Species", _
    GetType(String), _
    GetType(Fish), _
    Nothing)
    Public Property Species As String
        Get
            Species = CType(GetValue(SpeciesProperty), String)
        End Get
        Set(value As String)
            SetValue(SpeciesProperty, value)
        End Set
    End Property
End Class

설명

DependencyObject 클래스를 사용하면 많은 파생 클래스에서 종속성 속성 시스템 서비스를 사용할 수 있습니다. 종속성 속성 개념에 대한 자세한 내용은 종속성 속성 개요를 참조하세요.

종속성 속성 시스템의 기본 함수는 속성 값을 계산하고 변경된 값에 대한 시스템 알림을 제공하는 것입니다. 종속성 속성 시스템에 참여하는 또 다른 키 클래스는 다음과 같습니다 DependencyProperty. DependencyProperty 에서는 종속성 속성을 속성 시스템에 등록할 수 있지만 DependencyObject를 기본 클래스로 사용하면 개체가 종속성 속성을 사용하고 설정할 수 있습니다.

DependencyObject에서 제공하거나 지원하는 몇 가지 주목할 만한 서비스 및 특징은 다음과 같습니다.

  • 기존 Windows 런타임 종속성 속성에 대한 종속성 속성 호스팅 지원
  • 사용자 지정 종속성 속성 호스팅 지원 메서드를 호출 Register 하고 메서드의 반환 값을 DependencyObject 클래스에 공용 정적 속성으로 저장하여 종속성 속성을 등록합니다.
  • 기존 Windows 런타임 연결된 속성에 대한 연결된 속성 호스팅 지원입니다.
  • 사용자 지정 연결된 속성 호스팅 지원. 메서드를 호출 RegisterAttached 하고 메서드의 반환 값을 클래스에 공용 정적 속성으로 저장하여 연결된 속성 사용에 대한 종속성 속성을 등록합니다.
  • DependencyObject에 있는 모든 종속성 속성의 값에 대한 유틸리티 메서드를 가져와****서 설정합니다. 사용자 지정 종속성 속성 "래퍼"를 정의할 때 이러한 속성을 사용하고 기존 "래퍼" 속성을 사용하는 대신 앱 코드에서 사용할 수도 있습니다.
  • 메타데이터 또는 속성 값(예: GetAnimationBaseValue)을 검사하기 위한 고급 시나리오 유틸리티입니다.
  • 모든 DependencyObject 인스턴스에 대한 Windows 런타임 주 UI 스레드에 대한 스레드 선호도 적용
  • Dispatcher 고급 스레딩 시나리오에 대한 속성입니다. 값을 가져오 Dispatcher 면 개체에 대한 참조가 CoreDispatcher 제공됩니다. CoreDispatcher이 경우 작업자 스레드는 DependencyObject를 사용하지만 UI 스레드에 없는 코드를 실행할 수 있습니다. 이는 UI 스레드를 차단하거나 방해하지 않는 비동기 작업으로 실행을 연기할 수 있기 CoreDispatcher 때문입니다. 아래의 "DependencyObject 및 스레딩" 섹션을 참조하세요.
  • 기본 데이터 바인딩 및 스타일 지정을 지원합니다. 속성이 개체의 수명 중 나중에 계산될 수 있도록 식으로 설정할 수 있도록 합니다. 이러한 개념은 종속성 속성 개요에 자세히 설명되어 있습니다. 데이터 바인딩에 대해서도 자세히 알아보세요.

DependencyObject 및 스레딩

모든 DependencyObject 인스턴스는 앱의 현재 Window 와 연결된 UI 스레드에 만들어야 합니다. 이는 시스템에 의해 적용되며 코드에 두 가지 중요한 의미가 있습니다.

  • 두 DependencyObject 인스턴스의 API를 사용하는 코드는 항상 UI 스레드인 동일한 스레드에서 실행됩니다. 일반적으로 이 시나리오에서는 스레딩 문제가 발생하지 않습니다.
  • DependencyObject에는 UI 스레드에 대한 스레드 선호도만 있으므로 주 UI 스레드에서 실행되지 않는 코드는 DependencyObject에 직접 액세스할 수 없습니다. UI 스레드에서 실행되는 코드만 종속성 속성의 값을 변경하거나 읽을 수 있습니다. 예를 들어 .NET 작업 또는 명시적 ThreadPool 스레드로 시작한 작업자 스레드는 종속성 속성을 읽거나 다른 API를 호출할 수 없습니다.

작업자 스레드에서 DependencyObject를 사용하는 것이 완전히 차단되지는 않습니다. 그러나 앱 UI 스레드와 시스템에서 실행되는 다른 스레드 간의 고의DependencyObject.Dispatcher적인 분리를 건너뛰려면 DependencyObject에서 개체(값)를 가져와 CoreDispatcher 야 합니다. 메서드 CoreDispatcher 를 노출합니다 RunAsync . 대기 가능 코드()IAsyncAction를 실행하기 위해 호출 RunAsync 합니다. 간단한 코드인 경우 람다 식을 사용할 수 있습니다. 그렇지 않으면 대리자(DispatchedHandler)로 구현할 수 있습니다. 시스템에서 코드를 실행할 수 있는 시간을 결정합니다. 스레드 DependencyObject.Dispatcher 간에 액세스를 사용하도록 설정하므로 DependencyObject의 유일한 인스턴스 API이거나 스레드 간 예외를 throw하지 않고 비 UI 스레드에서 액세스할 수 있는 하위 클래스입니다. 다른 모든 DependencyObject API는 작업자 스레드 또는 다른 비 UI 스레드에서 호출하려고 하면 예외를 throw합니다.

일반적으로 일반적인 UI 코드에서는 스레딩 문제를 방지할 수 있습니다. 그러나 디바이스는 일반적으로 UI 스레드와 연결되지 않습니다. 디바이스에서 얻은 정보를 사용하여 실시간으로 UI를 업데이트하는 경우 UI를 업데이트할 수 있도록 UI를 CoreDispatcher 가져와야 하는 경우가 많습니다. 서비스는 서비스에 액세스하는 데 사용하는 코드가 UI 스레드에서 실행되지 않을 수 있는 또 다른 경우입니다.

사용자 고유의 DependencyObject 형식을 정의하고 데이터 원본 또는 DependencyObject가 반드시 적절하지 않은 다른 시나리오(개체가 UI와 직접 관련되지 않기 때문에)에 사용하려고 하면 DependencyObject 관련 스레딩 문제가 발생할 수 있습니다. 예를 들어 프레젠테이션 전에 개체의 값을 변경하거나 디바이스, 서비스 또는 기타 외부 입력에 대한 응답으로 백그라운드 스레드 또는 다른 작업자 스레드를 사용하여 성능 최적화를 시도할 수 있습니다. 시나리오에 대한 종속성 속성이 실제로 필요한지 평가합니다. 표준 속성이 적절할 수 있습니다.

DependencyObject 파생 클래스

DependencyObject는 앱 및 해당 XAML UI에 사용하는 프로그래밍 모델의 기본인 몇 가지 즉시 파생 클래스에 대한 부모 클래스입니다. 다음은 몇 가지 주목할 만한 파생 클래스입니다.

생성자

DependencyObject()

파생 클래스에 대한 DependencyObject 기본 클래스 초기화 동작을 제공합니다.

속성

Dispatcher

이 개체가 CoreDispatcher 연결된 개체를 가져옵니다. 코드 CoreDispatcher 가 비 UI 스레드에서 시작되는 경우에도 UI 스레드에 액세스할 DependencyObject 수 있는 기능을 나타냅니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.Dispatcher(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

메서드

ClearValue(DependencyProperty)

종속성 속성의 로컬 값을 지웁니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.ClearValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

GetAnimationBaseValue(DependencyProperty)

애니메이션이 활성화되지 않은 경우에 적용되는 종속성 속성에 대해 설정된 기본 값을 반환합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.GetAnimationBaseValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

GetValue(DependencyProperty)

에서 종속성 속성 DependencyObject의 현재 유효 값을 반환합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.GetValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

ReadLocalValue(DependencyProperty)

로컬 값이 설정된 경우 종속성 속성의 로컬 값을 반환합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.ReadLocalValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

DependencyObject 인스턴스의 특정 DependencyProperty 변경 내용을 수신 대기하기 위한 알림 함수를 등록합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.RegisterPropertyChangedCallback(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

SetValue(DependencyProperty, Object)

에 종속성 속성 DependencyObject의 로컬 값을 설정합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.SetValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

를 호출 RegisterPropertyChangedCallback하여 이전에 등록한 변경 알림을 취소합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.UnregisterPropertyChangedCallback(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

적용 대상

추가 정보