1

问题:是否有可能创建一个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.

  1. 你如何创建AdornerDecorator来包装你要装饰的元素?哦,是的,在创建装饰器期间这是不可能的(我不知道)。
  2. 如果您以某种方式设法创建AdornerDecorator,您仍然会遇到问题:它会窃取孩子中的所有装饰器,并放入这一层。再一次...... WTF!我怎么能假设所有的子元素装饰器,即使是我没有创建的,都应该去这一层?

换句话说,如果您不具体了解所有子元素及其装饰器,则无法控制装饰器出现的层。当创造无辜的洒水时,这就是全部的知识。

解决方法的可能性:

  1. 创建只抓取我们知道我们想要的装饰器的特殊 物品,其他的它会放手到下一个“全球”AdornerDecorator。AdornerDecorator
  2. 不知何故,让装饰器用这个装饰器包裹装饰元素的内部,并在这个装饰器中添加我们的装饰器。

我不喜欢这种解决方法,但糟糕的设计决策有时需要非常丑陋的黑客攻击......我认为这次我们需要这个。

4

0 回答 0