代码之家  ›  专栏  ›  技术社区  ›  Ciantic

允许一些装饰者通过的装饰器?

  •  1
  • Ciantic  · 技术社区  · 15 年前

    问题 :是否可以创建 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);
        }
    }
    

    我该怎么加 装饰设计师 里面 TextBox 把那个装饰品放在那层里面?当然,在行为内部,设计师不应该关心添加 装饰设计师 全部的 有装饰的元素…

    最好只有 装饰工应该去那里,而不是偷走所有其他的装饰工。

    你无法预测 创建装饰器时 装饰出现在哪一层…

    除非你 创造 装饰设计师 . 就是这样!你不能提前知道 哪层 它们看起来并不是这样设计的。这让整件事变得非常痛苦。

    假设您正在创建 只对 文本框 . 使之发挥作用 文本框 你需要 装饰设计师 把你的装饰品放在 文本框 .

    1. 如何创建 装饰设计师 要包装要装饰的元素?哦,是的,就是这样 可能(我不知道)在创造装饰。
    2. 如果你设法创造 装饰设计师 你还有问题:它 偷走所有的装饰品 在childs中,把它放在这一层。再一次…世界跆拳道联盟!我怎么能假定所有子元素装饰器,即使是我没有创建的子元素装饰器,都应该转到这个层?

    换言之,如果你没有特别指出,就无法控制你的装饰器出现在哪一层。 了解所有子元素及其装饰 也.这就是全部 非常了解 当创造无辜的花洒。

    解决方法:

    1. 创造 特殊的 装饰设计师 抓住 只有我们知道我们想要的装饰品 ,其他的则会放在下一个“全球”装饰设计师身上。
    2. 以某种方式使装饰器用这个装饰器包装装饰元素的内部,并添加我们的装饰器 只是 在这个装饰里面。

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

    0 回复  |  直到 13 年前