DependencyObject 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
종속성 속성 시스템에 참가하는 개체를 나타냅니다. DependencyObject는 UIElement, Geometry, FrameworkTemplate, Style 및 ResourceDictionary와 같은 많은 중요한 UI 관련 클래스의 즉각적인 기본 클래스입니다. DependencyObject에서 종속성 속성을 지원하는 방법에 대한 자세한 내용은 종속성 속성 개요를 참조하세요.
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
- 상속
- 파생
- 특성
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 접근자 구현 전체를 구성합니다. 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); }
}
}
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를 사용하면 CoreDispatcher가 UI 스레드를 차단하거나 방해하지 않는 비동기 작업으로 실행을 연기할 수 있으므로 작업자 스레드는 DependencyObject를 사용하지만 UI 스레드에 없는 코드를 실행할 수 있습니다. 아래의 "DependencyObject 및 스레딩" 섹션을 참조하세요.
- 기본 데이터 바인딩 및 스타일 지정을 지원합니다. 속성을 식으로 설정할 수 있도록 하여 개체의 수명 중 나중에 계산할 수 있습니다. 이러한 개념은 종속성 속성 개요에서 자세히 설명합니다. 자세한 내용은 데이터 바인딩을 참조하세요.
DependencyObject 및 스레딩
앱의 현재 창 과 연결된 UI 스레드에서 모든 DependencyObject 인스턴스를 만들어야 합니다. 이는 시스템에 의해 적용되며 코드에 두 가지 중요한 의미가 있습니다.
- 두 DependencyObject 인스턴스의 API를 사용하는 코드는 항상 UI 스레드인 동일한 스레드에서 실행됩니다. 이 시나리오에서는 일반적으로 스레딩 문제가 실행되지 않습니다.
- 기본 UI 스레드에서 실행되지 않는 코드는 DependencyObject에 UI 스레드에 대한 스레드 선호도만 있으므로 DependencyObject에 직접 액세스할 수 없습니다. UI 스레드에서 실행되는 코드만 종속성 속성 값을 변경하거나 읽을 수 있습니다. 예를 들어 .NET 작업 또는 명시적 ThreadPool 스레드로 시작한 작업자 스레드는 종속성 속성을 읽거나 다른 API를 호출할 수 없습니다.
작업자 스레드에서 DependencyObject를 사용하는 것이 완전히 차단되지는 않습니다. 그러나 앱 UI 스레드와 시스템에서 실행되는 다른 스레드 간의 의도적인 분리를 건너뛰려면 DependencyObject에서 CoreDispatcher 개체( DependencyObject.Dispatcher 값)를 가져와야 합니다. CoreDispatcher는 RunAsync 메서드를 노출합니다. RunAsync를 호출하여 대기 가능한 코드(IAsyncAction)를 실행합니다. 간단한 코드인 경우 람다 식을 사용할 수 있습니다. 그렇지 않으면 대리자로 구현할 수 있습니다(DispatchedHandler). 시스템에서 코드를 실행할 수 있는 시간을 결정합니다. 스레드 간에 액세스를 사용하도록 설정하기 때문에 DependencyObject.Dispatcher는 DependencyObject의 유일한 instance API이거나 스레드 간 예외를 throw하지 않고 비 UI 스레드에서 액세스할 수 있는 하위 클래스입니다. 다른 모든 DependencyObject API는 작업자 스레드 또는 다른 비 UI 스레드에서 호출하려고 하면 예외를 throw합니다.
일반적으로 일반적인 UI 코드에서는 스레딩 문제를 방지할 수 있습니다. 그러나 디바이스는 일반적으로 UI 스레드와 연결되지 않습니다. 디바이스에서 얻은 정보를 사용하여 실시간으로 UI를 업데이트하는 경우 UI를 업데이트할 수 있도록 CoreDispatcher 를 가져와야 하는 경우가 많습니다. 서비스는 서비스에 액세스하는 데 사용하는 코드가 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 클래스를 지원합니다.
- 시각적 상태 모델: 전환, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- 데이터 바인딩 지원: BindingBase ( 바인딩의 부모), CollectionViewSource, PropertyPath, RelativeSource.
- 스토리보드 애니메이션: 타임라인 ( 스토리보드의 부모, 형식화된 애니메이션, 테마 애니메이션), 형식화된 키프레임( 예: ColorKeyFrame), KeySpline, EasingFunctionBase.
- XAML 그래픽 및 렌더링 기본 형식: 브러시, 기하 도형, GeneralTransform, GradientStop, PathFigure, PathSegment, 프로젝션.
- 이미징 및 렌더링 표면 interop: ImageSource ( BitmapSource, RenderTargetBitmap, SurfaceImageSource 등의 부모).
- Window: 기본 앱 창을 나타냅니다.
- FlyoutBase ( 플라이아웃 및 MenuFlyout의 부모).
- ResourceDictionary: XAML에서 키 지정된 리소스를 정의합니다.
- TextElement: Block 및 Inline의 부모이며, TextBlock 콘텐츠 또는 서식 있는 텍스트 요소에 사용되는 텍스트 요소에 대한 기본 클래스입니다.
- AutomationPeer: Microsoft UI 자동화 수신기에 대한 XAML 컨트롤을 나타내는 Microsoft UI 자동화 피어의 기본 클래스입니다. 또한 IRawElementProviderSimple입니다.
- 기타: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TimelineMarker, TriggerAction, TriggerBase.
생성자
DependencyObject() |
DependencyObject 파생 클래스에 대한 기본 클래스 초기화 동작을 제공합니다. |
속성
Dispatcher |
이 개체가 연결된 CoreDispatcher 를 가져옵니다. CoreDispatcher는 코드가 비 UI 스레드에서 시작되더라도 UI 스레드에서 DependencyObject에 액세스할 수 있는 기능을 나타냅니다. |
메서드
ClearValue(DependencyProperty) |
종속성 속성의 로컬 값을 지웁니다. |
GetAnimationBaseValue(DependencyProperty) |
애니메이션이 활성화되지 않은 경우에 적용되는 종속성 속성에 대해 설정된 기본 값을 반환합니다. |
GetValue(DependencyProperty) |
DependencyObject에서 종속성 속성의 현재 유효 값을 반환합니다. |
ReadLocalValue(DependencyProperty) |
로컬 값이 설정된 경우 종속성 속성의 로컬 값을 반환합니다. |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
이 DependencyObject instance 특정 DependencyProperty에 대한 변경 내용을 수신 대기하기 위한 알림 함수를 등록합니다. |
SetValue(DependencyProperty, Object) |
DependencyObject에 대한 종속성 속성의 로컬 값을 설정합니다. |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
RegisterPropertyChangedCallback을 호출하여 이전에 등록된 변경 알림을 취소합니다. |