AdornerDecorator, который пропускает некоторые украшения?

Вопрос: возможно ли создать AdornerDecorator это занимает только AdornerЯ хочу его 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 внутри TextBoxи поместите это украшение внутри этого слоя? Внутри поведения, конечно, дизайнер не должен заботиться о добавлении AdornerDecorator на всех элементах, которые имеют украшения...

Желательно, чтобы туда ходил только этот украшатель, а не крал все остальные украшатели.

Вы не можете предсказать при создании украшений, какой слой появляетсяукрашатель...

Если вы несоздаетеAdornerDecorator, Это оно! Вы не можете знать заранее, накаком слое они появляются, они не предназначены для такой работы. Это делает все это просто агонией.

Представьте, что вы создаете рекламного агента, которыйработает только на TextBox, Чтобы заставить его работать и действовать по TextBoxтебе нужноAdornerDecoratorдержать ваши украшения на вершинеTextBox,

  1. Как вы создаетеAdornerDecorator обернуть элемент, который вы собираетесь украсить? Ах да, это невозможно (не то, что я знаю) во время создания украшения.
  2. Если вам как-то удастся создать AdornerDecorator у вас все еще есть проблемы: он крадет все украшения у детей и кладет на этот слой. Еще раз... WTF! Как я могу предположить, что все украшатели дочерних элементов, даже те, которые я не создал, должны перейти на этот слой?

Другими словами, нет никакого способа контролировать, какой слой появляется у вашего автора, если вы точно не знаете все дочерние элементы и их элементы. Это очень много знать при создании невинных брызг.

Возможность обхода проблемы:

  1. Создать специальный AdornerDecorator он захватывает только те украшения, которые, как мы знаем, нам нужны, другие могут позволить перейти к следующему "глобальному" AdornerDecorator.
  2. Каким-то образом заставить украшателя обернуть внутренности украшенного элемента этим декоратором и добавить наши украшения прямо внутри этого декоратора.

Мне не нравится этот обходной путь, но плохие дизайнерские решения иногда требуют очень уродливых хаков... Я думаю, что в этот раз нам это нужно.

0 ответов

Другие вопросы по тегам