2012-01-09 6 views
2

私はコントロールに単純なTextblockを追加しようとしています。しかし、私はそれが私の飾られたコントロールのすぐ上に配置されることを望みます。AdornerLayout、Adorner、または飾られたコントロールからAdornerPanelにアクセスしますか?

これは装飾の作成(このコードに依存しているdoesntの問題)である:

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

私が何を達成することはできませんどのような、飾らコントロールの上に、装飾のpositionningです。私は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 
    }; 
関連する問題