首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从AdornerLayout、装饰器或装饰控件访问AdornerPanel?

从AdornerLayout、装饰器或装饰控件访问AdornerPanel?
EN

Stack Overflow用户
提问于 2012-01-09 18:45:24
回答 2查看 724关注 0票数 3

我正在尝试添加一个简单的Textblock作为控件的装饰。但我希望它位于我装饰过的控件的正上方。

这是装饰性的创建(问题并不依赖于此代码):

代码语言:javascript
复制
public void AddLabelDecoration()
{
    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this);

    TextBlock textBlockMarkTooltipContent = new TextBlock();
    textBlockMarkTooltipContent.Text = "Test Label Adorner";

    _labelAdornerMarkTooltipContentAdorner = new Adorner(this)
    {
        Child = textBlockMarkTooltipContent 
    };

    adornerLayer.Add(_labelAdornerMarkTooltipContentAdorner);
}

我不能做到的是,在装饰的控制之上定位装饰。我想使用this MSDN code sample,它利用AdornerPanel来做定位…

然而,我还没有想出如何访问AdornerPanel对象来应用这个MSDN代码示例...无论是从我装饰的控件,从AdornedLayout,还是从装饰器...

我承认我不清楚AdornerPanel和AdornerLayout之间的WPF类层次结构。

感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-09 19:51:28

代码语言:javascript
复制
public void AddLabelDecoration()
{
    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this);

    TextBlock textBlockMarkTooltipContent = new TextBlock();
    textBlockMarkTooltipContent.Text = "Test Label Adorner";

    AdornerPanel labelAdornerAdornerPanel = new AdornerPanel();

    // add your TextBlock to AdornerPanel
    labelAdornerAdornerPanel.Children.Add(textBlockMarkTooltipContent);

    // set placements on AdornerPanel
    AdornerPlacementCollection placement = new AdornerPlacementCollection();
    placement.PositionRelativeToAdornerHeight(-1, 0);
    placement.PositionRelativeToAdornerWidth(1, 0);
    AdornerPanel.SetPlacements(labelAdornerAdornerPanel, placement);

    // create Adorner with AdornerPanel inside
    _labelAdornerMarkTooltipContentAdorner = new Adorner(this)
    {
        Child = labelAdornerAdornerPanel
    };

    adornerLayer.Add(_labelAdornerMarkTooltipContentAdorner);
}
票数 3
EN

Stack Overflow用户

发布于 2012-01-09 19:22:30

为了移动你的装饰器,你必须重写ArrangeOverride方法并调整一个新的装饰器位置。

下面是一个包含简单FrameworkElementAdorner的示例。

代码语言:javascript
复制
  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)
    {
      // Adjust your offset here:
      _child.Arrange(new Rect(new Point(-20, -20), finalSize));
      return new Size(_child.ActualWidth, _child.ActualHeight);
    }

用法:

代码语言:javascript
复制
  TextBlock textBlockMarkTooltipContent = new TextBlock();
  textBlockMarkTooltipContent.Text = "Test Label Adorner";

  var adorner = new FrameworkElementAdorner(this)
  {
    Child = textBlockMarkTooltipContent
  };
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8787202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档