代码之家  ›  专栏  ›  技术社区  ›  Jason Anderson

装饰器内的动画(调用OnRender)

  •  6
  • Jason Anderson  · 技术社区  · 17 年前

    我在.NET3.5中使用了一个装饰器,我可以通过重写OnRender进行绘制,但我需要能够重新绘制装饰器以更改其外观。

    本质上,我正在寻找一种清除绘图上下文并再次调用OnRender的方法。最好的方法是什么,或者有更好的方法吗?

    public class MyAdorner : Adorner
    {
        private Brush brush = Brushes.Red;
    
        public DragArrowAdorner(UIElement adornedElement) : base(adornedElement)
        {}
    
        public void RedrawWithBrush(Brush newBrush)
        {
            brush = newBrush;
    
            // redraw..?
        }
    
        protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
        {
            // some drawing code...
            drawingContext.DrawRectangle(
                brush, 
                null, 
                new Rect(AdornedElement.DesiredSize));
        }
    }
    
    2 回复  |  直到 17 年前
        1
  •  11
  •   Franci Penov    17 年前

    你问题的答案是使用 InvalidateVisual

    如果要采用这种方法,则在adorner类中,您需要:

    • 在构造函数中,调用 base.AddVisualChild() 或者使用要在装饰器中显示的视觉效果创建自己的视觉效果集合
    • ArrangeOverride(Size size) 为了妥善安排孩子;
    • 推翻 VisualChildrenCount 返回装饰器可视树中的子级数;
    • 推翻 GetCisualChild(int index) 返回一个特定的孩子。

    你可以看一下 ResizingAdorner 更多信息请参阅MSDN示例。

        2
  •  2
  •   David Jeske    9 年前

    OnRender() 真的应该叫 AccumulateDrawingObjects() 改变 之后 OnRender()

    例如,您可以制作一个 DrawingGroup “backingStore”,并将其放入 DrawingContext OnRender . 然后,只要你想改变视觉效果,你就可以 DrawingGroup.Open()

    看起来是这样的:

    DrawingGroup backingStore = new DrawingGroup();
    
    protected override void OnRender(DrawingContext drawingContext) {      
        base.OnRender(drawingContext);            
    
        Render(); // put content into our backingStore
        drawingContext.DrawDrawing(backingStore);
    }
    
    // I can call this anytime, and it'll update my visual drawing
    // without ever triggering layout or OnRender()
    private void Render() {            
        var drawingContext = backingStore.Open();
        Render(drawingContext);
        drawingContext.Close();            
    }
    
    推荐文章