다음을 통해 공유


표시기 개요

표시기(adorner)는 사용자에게 시각적 큐를 제공하기 위해 사용되는 FrameworkElement의 특수 형식입니다. 또한 표시기를 사용하여 함수 핸들을 요소에 추가하거나 컨트롤에 대한 상태 정보를 제공할 수 있습니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 표시기 정보
  • 사용자 지정 표시기 구현
  • 표시기의 렌더링 동작
  • 이벤트 및 적중 테스트
  • 단일 UIElement 표시
  • 패널 자식 표시
  • 관련 항목

표시기 정보

AdornerUIElement에 바인딩된 사용자 지정 FrameworkElement입니다. 표시기는 항상 표시된 요소 또는 표시된 요소 컬렉션의 맨 위에 있는 렌더링 화면인 AdornerLayer에 렌더링됩니다. 표시기의 렌더링은 표시기가 바인딩된 UIElement의 렌더링과 독립적입니다. 표시기는 대개 표시된 요소의 왼쪽 위에 있는 표준 2차원 좌표 원점을 사용하여 해당 표시기가 바인딩되는 요소를 기준으로 배치됩니다.

표시기의 일반적인 응용 프로그램에서는 다음을 수행합니다.

  • UIElement에 사용자가 크기 조정, 회전, 위치 변경과 같은 방법으로 요소를 조작할 수 있는 기능 핸들 추가

  • 다양한 상태를 나타내거나 다양한 이벤트에 응답하기 위해 시각적 피드백 제공

  • UIElement에 시각적 데코레이션 오버레이

  • UIElement의 일부 또는 전체를 시각적으로 마스킹 또는 재정의

Windows Presentation Foundation (WPF)에서는 시각적 요소를 표시하기 위한 기본 프레임워크를 제공합니다. 다음 표에서는 개체를 표시할 때 사용되는 기본 형식 및 각 기본 형식의 용도를 보여 줍니다. 다음은 몇 가지 사용법의 예입니다.

Adorner

모든 구체적인 표시기 구현에서 상속하는 추상 기본 클래스입니다.

AdornerLayer

하나 이상의 표시된 요소의 표시기에 대한 렌더링 계층을 나타내는 클래스입니다.

AdornerDecorator

표시기 계층을 요소 컬렉션에 연결할 수 있는 클래스입니다.

사용자 지정 표시기 구현

Windows Presentation Foundation (WPF)에서 제공하는 표시기 프레임워크는 기본적으로 사용자 지정 표시기 만들기를 지원합니다. 사용자 지정 표시기는 추상 Adorner 클래스에서 상속되는 클래스를 구현하여 생성됩니다.

참고참고

Adorner의 부모는 표시되는 요소가 아니라 Adorner를 렌더링하는 AdornerLayer입니다.

다음 예제에서는 간단한 표시기를 구현하는 클래스를 보여 줍니다. 예제에서 보여 주는 표시기는 원으로 UIElement의 모퉁이를 간단하게 표시합니다.

Public Class SimpleCircleAdorner
    Inherits Adorner
    Sub New(ByVal adornedElement As UIElement)
        MyBase.New(adornedElement)
    End Sub

    Protected Overrides Sub OnRender(ByVal drawingContext As System.Windows.Media.DrawingContext)
        MyBase.OnRender(drawingContext)
        Dim adornedElementRect As New Rect(AdornedElement.DesiredSize)
        Dim renderBrush As New SolidColorBrush(Colors.Green)
        renderBrush.Opacity = 0.2
        Dim renderPen As New Pen(New SolidColorBrush(Colors.Navy), 1.5)
        Dim renderRadius As Double
        renderRadius = 5.0

        'Draw a circle at each corner.
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius)
    End Sub
End Class
// Adorners must subclass the abstract base class Adorner.
public class SimpleCircleAdorner : Adorner
{
  // Be sure to call the base class constructor.
  public SimpleCircleAdorner(UIElement adornedElement)
    : base(adornedElement) 
  { 
  }

  // A common way to implement an adorner's rendering behavior is to override the OnRender
  // method, which is called by the layout system as part of a rendering pass.
  protected override void OnRender(DrawingContext drawingContext)
  {
    Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);

    // Some arbitrary drawing implements.
    SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
    renderBrush.Opacity = 0.2;
    Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);
    double renderRadius = 5.0;

    // Draw a circle at each corner.
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
  }
}

다음 이미지에서는 TextBox에 적용된 SimpleCircleAdorner를 보여 줍니다.

표시기 예제: 표시된 TextBox

표시기의 렌더링 동작

표시기에는 어떠한 고유 렌더링 동작도 포함되지 않으므로 표시기 구현자가 표시기를 렌더링해야 합니다. 일반적으로 렌더링 동작을 구현할 때는 OnRender 메서드를 재정의하고 필요에 따라 하나 이상의 DrawingContext 개체를 사용하여 표시기의 시각적 요소를 렌더링합니다(위의 예제 참조).

참고참고

표시기 계층에 배치된 모든 요소는 사용자가 설정한 나머지 스타일의 맨 위에 렌더링됩니다.즉, 표시기는 항상 맨 위에 표시되며 Z 순서를 사용하여 재정의할 수 없습니다.

이벤트 및 적중 테스트

표시기는 다른 모든 FrameworkElement와 같이 입력 이벤트를 받습니다. 표시기의 Z 순서는 항상 표시기가 표시하는 요소보다 상위에 있기 때문에 표시기는 내부 표시된 요소를 대상으로 하는 Drop 또는 MouseMove와 같은 입력 이벤트를 받습니다. 표시기는 특정 입력 이벤트를 수신 대기하고 해당 이벤트를 다시 발생시켜 내부 표시된 요소에 전달할 수 있습니다.

표시기 아래에 있는 요소의 통과 적중 테스트 기능을 사용하려면 표시기에서 적중 테스트 IsHitTestVisible 속성을 false로 설정해야 합니다. 적중 테스트에 대한 자세한 내용은 다음을 참조하십시오.

시각적 계층에서 적중 테스트.

단일 UIElement 표시

표시기를 특정 UIElement에 바인딩하려면 다음 단계를 수행합니다.

  1. 정적 메서드인 GetAdornerLayer를 호출하여 표시할 UIElementAdornerLayer 개체를 가져옵니다. GetAdornerLayer는 지정된 UIElement에서 시각적 트리를 검색하여 발견하는 첫 번째 표시기 계층을 반환하며 표시기 계층이 없으면 null을 반환합니다.

  2. Add 메서드를 호출하여 대상 UIElement에 표시기를 바인딩합니다.

다음 예제에서는 위의 SimpleCircleAdorner를 myTextBox라는 TextBox에 바인딩합니다.

myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox)
myAdornerLayer.Add(New SimpleCircleAdorner(myTextBox))
myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox);
myAdornerLayer.Add(new SimpleCircleAdorner(myTextBox));
참고참고

Extensible Application Markup Language (XAML)을 사용하여 표시기를 다른 요소에 바인딩하는 기능은 현재 지원되지 않습니다.

패널 자식 표시

표시기를 Panel 자식에 바인딩하려면 다음 단계를 수행합니다.

 

  1. static 메서드 GetAdornerLayer를 호출하여 표시될 자식의 요소에 대한 표시기 계층을 찾습니다.

  2. 부모 요소의 자식을 열거하고 Add 메서드를 호출하여 표시기를 각 자식 요소에 바인딩합니다.

다음 예제에서는 위의 SimpleCircleAdorner를 myStackPanel라는 StackPanel의 자식에 바인딩합니다.

            For Each toAdorn As UIElement In myStackPanel.Children
                myAdornerLayer.Add(New SimpleCircleAdorner(toAdorn))
            Next

foreach (UIElement toAdorn in myStackPanel.Children)
  myAdornerLayer.Add(new SimpleCircleAdorner(toAdorn));

참고 항목

참조

AdornerHitTestResult

개념

WPF에서 Shape 및 기본 그리기 개요

이미지, 그림 및 시각적 표시로 그리기

Drawing 개체 개요

기타 리소스

표시기 방법 항목