2012-01-09 1 views
2

컨트롤에 단순 텍스트 블록을 추가하려고합니다. 그러나 나는 그것이 내 장식 된 컨트롤 바로 위에 위치하기를 원합니다.AdornerLayout, Adorner 또는 장식 된 컨트롤에서 AdornerPanel에 액세스 하시겠습니까?

내가하고 달성 할 수없는 무엇
public void AddLabelDecoration() 
{ 
    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this); 

    TextBlock textBlockMarkTooltipContent = new TextBlock(); 
    textBlockMarkTooltipContent.Text = "Test Label Adorner"; 

    _labelAdornerMarkTooltipContentAdorner = new Adorner(this) 
    { 
     Child = textBlockMarkTooltipContent 
    }; 

    adornerLayer.Add(_labelAdornerMarkTooltipContentAdorner); 
} 

가의 장식 컨트롤 위의 장식의으로 위치입니다 :

은 장식 만들기 (이 코드에 의존 나던 문제)입니다. 나는 this MSDN code sample을 사용하여 AdornerPanel을 사용하여 위치 지정 작업을 수행합니다. ...

그러나이 MSDN 코드 샘플을 적용하기 위해 AdornerPanel 객체에 액세스하는 방법을 알아 내지 못했습니다. 내 장식 컨트롤, AdornedLayout 또는 Adorner에서 ...

AdornerPanel과 AdornerLayout 사이의 WPF 클래스 계층 구조를 이해할 수 없다는 것을 인정합니다.

도움을 주시면 감사하겠습니다.

답변

2
public void AddLabelDecoration() 
{ 
    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this); 

    TextBlock textBlockMarkTooltipContent = new TextBlock(); 
    textBlockMarkTooltipContent.Text = "Test Label Adorner"; 

    AdornerPanel labelAdornerAdornerPanel = new AdornerPanel(); 

    // add your TextBlock to AdornerPanel 
    labelAdornerAdornerPanel.Children.Add(textBlockMarkTooltipContent); 

    // set placements on AdornerPanel 
    AdornerPlacementCollection placement = new AdornerPlacementCollection(); 
    placement.PositionRelativeToAdornerHeight(-1, 0); 
    placement.PositionRelativeToAdornerWidth(1, 0); 
    AdornerPanel.SetPlacements(labelAdornerAdornerPanel, placement); 

    // create Adorner with AdornerPanel inside 
    _labelAdornerMarkTooltipContentAdorner = new Adorner(this) 
    { 
     Child = labelAdornerAdornerPanel 
    }; 

    adornerLayer.Add(_labelAdornerMarkTooltipContentAdorner); 
} 
2

Adorner를 이동하려면 ArrangeOverride 메서드를 재정 의하여 거기에 새로운 adorner 위치를 조정해야합니다.

다음은 간단한 FrameworkElementAdorner를 사용한 예입니다.

public class FrameworkElementAdorner : Adorner 
    { 
    private FrameworkElement _child; 

    public FrameworkElementAdorner(UIElement adornedElement) 
     : base(adornedElement) 
    { 
    } 

    protected override int VisualChildrenCount 
    { 
     get { return 1; } 
    } 

    public FrameworkElement Child 
    { 
     get { return _child; } 
     set 
     { 
     if (_child != null) 
     { 
      RemoveVisualChild(_child); 
     } 
     _child = value; 
     if (_child != null) 
     { 
      AddVisualChild(_child); 
     } 
     } 
    } 

    protected override Visual GetVisualChild(int index) 
    { 
     if (index != 0) throw new ArgumentOutOfRangeException(); 
     return _child; 
    } 

    protected override Size MeasureOverride(Size constraint) 
    { 
     _child.Measure(constraint); 
     return _child.DesiredSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     // Adjust your offset here: 
     _child.Arrange(new Rect(new Point(-20, -20), finalSize)); 
     return new Size(_child.ActualWidth, _child.ActualHeight); 
    } 

사용법 :

TextBlock textBlockMarkTooltipContent = new TextBlock(); 
    textBlockMarkTooltipContent.Text = "Test Label Adorner"; 

    var adorner = new FrameworkElementAdorner(this) 
    { 
    Child = textBlockMarkTooltipContent 
    }; 
관련 문제