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

2024-03-20

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

是否可以构建一个堆栈面板,其中包含文本框和图像 - 并将其指定为装饰器?

顺便说一下,我使用的是 Visual Studio 2010,而不是 microsoft Expression。

多谢,

Dan


不,这不可能开箱即用,因为 DrawingContext 仅用于绘制视觉对象,而不用于绘制 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);

如果您多次使用 StackPanel 的这种组合,您还可以将 StackPanel 的创建直接合并到 Adorner 中。这取决于你的场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DrawingContext 装饰器 - 可以绘制堆栈面板吗? 的相关文章

随机推荐