none
请教使用DrawingVisual绘制的图像如何让重绘 RRS feed

  • 问题

  • 我使用DrawingVisual绘制了一个仪表:
                private DrawingVisual create_hud()
                {
                    DrawingVisual dv = new DrawingVisual();
                    DrawingContext dc = dv.RenderOpen();
    
                    heading.draw(dc);
                    rh.draw(dc);
                    th.draw(dc);
                    speed.draw(dc);
                    elevation.draw(dc);
                    hight_meter.draw(dc);
                    rool.draw(dc);
    
                    dc.Close();
                    return dv;
                }
    绘制完后,希望刷新这个绘制,请问该怎么做呢?
    2012年6月14日 11:20

答案

  • 是的,你所提及的方式是对的,在OnRender时候去更新 _children 的内容来达到重绘。但是根据你重绘的内容,性能会不一样。

    既然你的设计是想通过DrawingContext绘制内容,那么你可以通过继承Control或者直接创建一个UserControl,在OnRender中实现你的绘制代码。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月15日 10:13
    版主

全部回复

  • 调用Element的, InvalidateVisual 方法,就会导致OnRender方法去重绘。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月15日 6:10
    版主
  • 谢谢您的答复,但是,我的程序中没有定义OnRender方法,

                private DrawingVisual create_hud()
                {
                    DrawingVisual dv = new DrawingVisual();
                    DrawingContext dc = dv.RenderOpen();
    
                    heading.draw(dc);
                    rh.draw(dc);
                    th.draw(dc);
                    speed.draw(dc);
                    elevation.draw(dc);
                    hight_meter.draw(dc);
                    rool.draw(dc);
    
                    dc.Close();
                    return dv;
                }
    
     _children = new VisualCollection(this);
     _children.Add(create_hud());

      我尝试过在派生自FrameworkElement的VisualHost类中,和派生自Window类的对话框类中调用 InvalidateVisual 方法,但是还是没有反应。按照描述, InvalidateVisual 会调用OnRender,所以是不是只有在OnRender内绘制的图形才能调用 InvalidateVisual 更新?

      我还实验出过一种方法,就是在重绘的时候

                    _children.Clear();
                    _children.Add(create_hud());
      但是这样做效率很低,CPU占用率高。
    2012年6月15日 9:51
  • 是的,你所提及的方式是对的,在OnRender时候去更新 _children 的内容来达到重绘。但是根据你重绘的内容,性能会不一样。

    既然你的设计是想通过DrawingContext绘制内容,那么你可以通过继承Control或者直接创建一个UserControl,在OnRender中实现你的绘制代码。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月15日 10:13
    版主
  • 谢谢您 感觉醍醐灌顶 哈哈
    2012年6月15日 13:45