让Adorner通过的AdornerDecorator?

时间:2009-10-15 21:10:27

标签: .net wpf .net-3.5 adorner adornerdecorator

问题:是否可以创建仅AdornerDecorator我想要Adorner的{​​{1}}?

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!我怎么能假设所有子元素装饰者,即使是我没有创建过的元素装饰者,也应该进入这一层?
  3. 换句话说,如果您没有专门知道所有子元素及其装饰者,则无法控制您的装饰者显示的图层。在创造无辜的洒水时,这完全是很多了解

    解决方法可能性:

    1. 创建特殊 AdornerDecorator,只抓取我们知道我们想要的装饰,其他人则会放到下一个“全球”AdornerDecorator。
    2. 以某种方式让装饰者用这个装饰器包装装饰元素的内部,并在这个装饰器中添加我们的装饰
    3. 我不喜欢这种解决方法,但糟糕的设计决策有时需要非常难看的黑客......我想这次我们需要这个。

0 个答案:

没有答案