DrawingContext Adorner - можно нарисовать стековую панель? - PullRequest
4 голосов
/ 20 декабря 2011

Используя класс DrawingContext, я смог использовать метод DrawRectangle(), чтобы успешно добавить рекламное объявление в мой adornedElement.

Можно ли построить панель стека с текстовым полем и изображением внутри - и назначить ее в качестве автора?

Кстати, я использую Visual Studio 2010, а не Microsoft.

Большое спасибо,

Dan

1 Ответ

12 голосов
/ 20 декабря 2011

Нет, это невозможно из коробки, так как 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);
    }
  }

Использование:

  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 несколько раз.Это зависит от вашего сценария.

...