简体   繁体   English

DrawingContext adorner - 可以绘制stackpanel吗?

[英]DrawingContext adorner - possible to draw stackpanel?

Using the DrawingContext class I've been able to use the DrawRectangle() method to successfully add an adorner to my adornedElement. 使用DrawingContext类,我已经能够使用DrawRectangle()方法成功地将adorner添加到我的adornedElement。

Is it possible to construct a stackpanel, with a textbox and image inside - and assign this as the adorner? 是否可以构建一个堆栈面板,内部有文本框和图像 - 并将其指定为装饰器?

I'm using visual studio 2010 by the way - not microsoft expression. 我顺便使用visual studio 2010 - 而不是微软表达。

Thanks a lot, 非常感谢,

Dan

No, this is not possible out of the box as the DrawingContext is only meant to draw Visuals and no FrameworkElements. 不,这是不可能的开箱即用,因为DrawingContext只是为了绘制Visuals而不是FrameworkElements。 What you can do is create your own Adorner which is able to draw FrameworkElements: 你可以做的是创建自己的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);
    }
  }

Usage: 用法:

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

You could also incorporate the creation of the StackPanel directly in the Adorner if you use this combination of a StackPanel multiple times. 如果多次使用StackPanel的这种组合,您还可以直接在Adorner中创建StackPanel。 That depends on your scenario. 这取决于你的情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM