표시기 개요

표시기는 사용자에게 시각 신호를 제공하는 데 사용하는 특별한 유형의 FrameworkElement입니다. 표시기는 다른 용도로 요소에 기능 핸들을 추가하거나 컨트롤에 대한 상태 정보를 제공하는 데 사용할 수 있습니다.

표시기 정보

AdornerUIElement에 바인딩된 사용자 지정 FrameworkElement입니다. 표시기는 항상 표시한 요소 또는 표시한 요소 컬렉션의 맨 위에 있는 렌더링 표면인 AdornerLayer에서 렌더링됩니다. 표시기의 렌더링은 표시기가 바인딩되어 있는 UIElement의 렌더링과는 관련이 없습니다. 표시기는 일반적으로 표시한 요소의 왼쪽 위에 있는 표준 2D 좌표 원점을 사용하여 바인딩된 요소를 기준으로 배치됩니다.

표시기에 대한 일반 애플리케이션은 다음과 같습니다.

  • 사용자가 크기 조정, 회전, 위치 변경 등의 방법으로 요소를 조작할 수 있도록 하는 기능 핸들을 UIElement에 추가합니다.
  • 다양한 상태를 나타내거나 다양한 이벤트에 대한 응답으로 시각적 피드백을 제공합니다.
  • UIElement에 시각적 장식을 오버레이합니다.
  • UIElement의 일부 또는 전체를 시각적으로 마스킹하거나 재정의합니다.

WPF(Windows Presentation Foundation)는 시각적 요소를 표시하기 위한 기본 프레임워크를 제공합니다. 다음 표에 개체 및 해당 용도를 표시할 때 사용되는 기본 유형이 나와 있습니다. 몇 가지 사용 예는 다음과 같습니다.

클래스 Description
Adorner 모든 구체적인 표시기 구현이 상속받는 추상 기본 클래스입니다.
AdornerLayer 하나 이상의 표시한 요소의 표시기에 대한 렌더링 계층을 나타내는 클래스입니다.
AdornerDecorator 표시기 계층이 요소 컬렉션에 연결될 수 있도록 하는 클래스입니다.

사용자 지정 표시기 구현

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

참고

부모는 Adorner 은 합니다 AdornerLayer 렌더링 하는 Adorner, 표시 되는 요소가 없습니다.

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

// 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);
  }
}
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

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

Screenshot that shows an adorned text box.

표시기에 대한 렌더링 동작

표시기에는 고유 렌더링 동작이 포함되어 있지 않음에 유의해야 합니다. 표시기를 렌더링하는 것은 표시기 구현자의 책임입니다. 렌더링 동작을 구현하는 일반적인 방법은 OnRender 메서드를 재정의하고 하나 이상의 DrawingContext 개체를 사용하여 위의 예제와 같이 필요에 따라 표시기의 시각적 개체를 렌더링하는 것입니다.

참고

표시기 계층에 배치된 모든 개체는 설정한 스타일의 나머지 부분 맨 위에 렌더링됩니다. 즉, 표시기는 시각적으로 항상 맨 위에 있으며 z-순서를 사용하여 재정의할 수 없습니다.

이벤트 및 적중 횟수 테스트

표시기는 다른 FrameworkElement와 같이 입력 이벤트를 받습니다. 표시기는 표시하는 요소보다 항상 z-순서가 높으므로 표시기는 표시한 기본 요소를 위한 것일 수 있는 입력 이벤트(예: Drop 또는 MouseMove)를 받습니다. 표시기는 특정 입력 이벤트를 수신하고 이벤트를 다시 발생시켜 표시한 기본 요소에 전달할 수 있습니다.

표시기 아래 요소의 통과 적중 횟수 테스트를 사용하려면 표시기에서 적중 테스트 IsHitTestVisible 속성을 false로 설정합니다. 적중 테스트에 대한 자세한 내용은 시각적 계층에서 적중 테스트를 참조하세요.

단일 UIElement 표시

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

  1. 정적 메서드 GetAdornerLayer를 호출하여 표시할 UIElement에 대한 AdornerLayer 개체를 가져옵니다. 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))

참고

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

패널의 자식 표시

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

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

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

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

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

참고 항목