2011-12-20 20 views
4

使用DrawingContext類我已經能夠使用DrawRectangle()方法成功地向我的adornedElement添加裝飾器。DrawingContext裝飾者 - 可能繪製​​堆疊面板?

是否有可能構建一個帶有文本框和圖像的堆棧面板 - 並將其指定爲裝飾者?

我使用visual studio 2010的方式 - 而不是微軟的表達。

非常感謝,

回答

12

沒有,這是不可能的開箱作爲的DrawingContext只是爲了畫的視覺效果和無FrameworkElements。 你可以做的是建立自己的裝飾器,它能夠得出FrameworkElements:

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) 
    { 
     _child.Arrange(new Rect(new Point(0, 0), finalSize)); 
     return new Size(_child.ActualWidth, _child.ActualHeight); 
    } 
    } 

用法:

var fweAdorner = new FrameworkElementAdorner(adornedElement); 

    //Create your own Content, here: a StackPanel with some stuff inside 
    var stackPanel = new StackPanel(); 
    stackPanel.Children.Add(new TextBox() { Text="TEST"}); 
    stackPanel.Children.Add(new Image()); 

    fweAdorner.Child = stackPanel; 

    var adornerLayer = AdornerLayer.GetAdornerLayer(adornedElement); 
    adornerLayer.Add(fweAdorner); 

你也可以直接納入的StackPanel的創作裝飾器,如果你使用這個組合一個StackPanel多次。這取決於你的情況。

+0

斯文,不能感謝你足夠的隊友!直接複製並粘貼到我的解決方案中,它的魅力!謝謝! – 2011-12-20 14:36:13

+0

不客氣! – SvenG 2011-12-20 14:38:04

+0

我也一樣Sven:你的代碼像魅力一樣工作!謝謝 !!! – Renaud 2012-04-13 15:29:48