C# 从装饰布局、装饰器或装饰控件访问装饰面板?
我试图添加一个简单的文本块作为对控件的崇拜。但我想把它放在我装饰好的控件上方 这是装饰创作(此代码中不存在此问题): 我无法做到的是装饰的定位,在装饰的控制之上。我想用,它利用装饰板来做定位 但是,我还没有弄明白如何访问AdornerPanel对象以便应用此MSDN代码示例。。。无论是从我的装饰控件、装饰布局还是装饰器 我承认我不清楚AdornerPanel和AdornerLayout之间的WPF类层次结构C# 从装饰布局、装饰器或装饰控件访问装饰面板?,c#,wpf,adorner,C#,Wpf,Adorner,我试图添加一个简单的文本块作为对控件的崇拜。但我想把它放在我装饰好的控件上方 这是装饰创作(此代码中不存在此问题): 我无法做到的是装饰的定位,在装饰的控制之上。我想用,它利用装饰板来做定位 但是,我还没有弄明白如何访问AdornerPanel对象以便应用此MSDN代码示例。。。无论是从我的装饰控件、装饰布局还是装饰器 我承认我不清楚AdornerPanel和AdornerLayout之间的WPF类层次结构 非常感谢您的帮助。要移动装饰条,您必须覆盖ArrangeOverride方法并在那里调整
非常感谢您的帮助。要移动装饰条,您必须覆盖ArrangeOverride方法并在那里调整新的装饰条位置 下面是一个简单的FrameworkElementAdorner示例
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);
}
用法:
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);
}
TextBlock textBlockMarkTooltipContent = new TextBlock();
textBlockMarkTooltipContent.Text = "Test Label Adorner";
var adorner = new FrameworkElementAdorner(this)
{
Child = textBlockMarkTooltipContent
};
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);
}