DrawingContext装饰器-可以绘制堆栈面板

本文关键字:绘制 堆栈 DrawingContext | 更新日期: 2023-09-27 18:18:36

使用DrawingContext类,我已经能够使用DrawRectangle()方法成功地向我的adornedElement添加一个装饰器。

是否有可能构建一个stackpanel,里面有一个文本框和图像-并将其分配为装饰器?

我用的是visual studio 2010,而不是microsoft expression.

谢谢你,

DrawingContext装饰器-可以绘制堆栈面板

不,这是不可能的,因为DrawingContext只意味着绘制视觉效果,而不是框架元素。你所能做的就是创建你自己的Adorner,它能够绘制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的这个组合,你也可以直接在Adorner中合并StackPanel的创建。