DrawingContext装饰器-可以绘制StackPanel吗? [英] DrawingContext adorner - possible to draw stackpanel?

查看:96
本文介绍了DrawingContext装饰器-可以绘制StackPanel吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 DrawingContext 类,我已经能够使用 DrawRectangle()方法成功添加装饰物到我的adornedElement。

Using the DrawingContext class I've been able to use the DrawRectangle() method to successfully add an adorner to my adornedElement.

是否可以构造一个内部带有文本框和图像的堆栈面板,并将其指定为装饰物?

Is it possible to construct a stackpanel, with a textbox and image inside - and assign this as the adorner?

我正在使用Visual Studio 2010,而不是Microsoft表达式。

非常感谢,

Dan

推荐答案

否,这是不可能的,因为DrawingContext仅意味着绘制视觉效果,没有FrameworkElements。
您可以做的是创建自己的Adorner并能够绘制FrameworkElements:

No, this is not possible out of the box as the DrawingContext is only meant to draw Visuals and no FrameworkElements. What you can do is create your own Adorner which is able to draw 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的创建多次。这取决于您的情况。

You could also incorporate the creation of the StackPanel directly in the Adorner if you use this combination of a StackPanel multiple times. That depends on your scenario.

这篇关于DrawingContext装饰器-可以绘制StackPanel吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆