问题:是否有可能创建一个AdornerDecorator
只需要Adorner
我想要的 s 的AdornerLayer
?
public class SimpleCircleBehavior : Behavior<TextBox>
{
private SimpleCircleAdorner sca;
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += new RoutedEventHandler(AssociatedObject_Loaded);
}
void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
sca = new SimpleCircleAdorner(AssociatedObject);
AdornerLayer.GetAdornerLayer(AssociatedObject).Add(sca);
}
}
public class SimpleCircleAdorner : Adorner
{
// Be sure to call the base class constructor.
public SimpleCircleAdorner(UIElement adornedElement)
: base(adornedElement)
{
}
// A common way to implement an adorner's rendering behavior is to override the OnRender
// method, which is called by the layout system as part of a rendering pass.
protected override void OnRender(DrawingContext drawingContext)
{
Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
// Some arbitrary drawing implements.
SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
renderBrush.Opacity = 0.2;
Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);
double renderRadius = 5.0;
// Draw a circle at each corner.
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
}
}
如何AdornerDecorator
在 a中添加TextBox
,并将该装饰器放在该层中?当然,在行为内部,设计师不应该关心添加所有AdornerDecorator
具有装饰器的元素......
最好只有这个装饰器应该去那里,而不是偷走所有其他的装饰器。
在创建装饰器时,您无法预测装饰器出现在哪一层......
除非你创建AdornerDecorator
. 而已!您无法提前知道它们出现在哪一层,它们并非设计为以这种方式工作。这让整个事情变得非常痛苦。
想象一下,您正在创建仅适用于TextBox
. 为了让它发挥作用并按照你的要求行事,TextBox
你需要AdornerDecorator
让你的装饰者保持在TextBox
.
- 你如何创建
AdornerDecorator
来包装你要装饰的元素?哦,是的,在创建装饰器期间这是不可能的(我不知道)。 - 如果您以某种方式设法创建
AdornerDecorator
,您仍然会遇到问题:它会窃取孩子中的所有装饰器,并放入这一层。再一次...... WTF!我怎么能假设所有的子元素装饰器,即使是我没有创建的,都应该去这一层?
换句话说,如果您不具体了解所有子元素及其装饰器,则无法控制装饰器出现的层。当创造无辜的洒水时,这就是全部的知识。
解决方法的可能性:
- 创建只抓取我们知道我们想要的装饰器的特殊 物品,其他的它会放手到下一个“全球”AdornerDecorator。
AdornerDecorator
- 不知何故,让装饰器用这个装饰器包裹装饰元素的内部,并在这个装饰器中添加我们的装饰器。
我不喜欢这种解决方法,但糟糕的设计决策有时需要非常丑陋的黑客攻击......我认为这次我们需要这个。