如何在OnRender中重绘或刷新?

Dav*_*vid 5 c# wpf drawing onrender

我想动态画一些东西.以下代码显示了我的OnRender.我正在我的程序中的某个地方设置DrawItem,我需要它.但是,当我打电话给DrawItem =5;我必须打电话时,OnRender会被调用吗?

protected override void OnRender(DrawingContext drawingContext)
{
    switch (DrawItem)
    {
        case 1:
            //Draw Item 
            break;
        case 2:
            //Draw Item 
            break;
        case 3:
            //Draw Item 
            break;
        case 4:
            //Draw Item 
            break;
        case 5:
            //Draw Item 
            break;
    }
    base.OnRender(drawingContext)
}

public int DrawItem { get; set; }
Run Code Online (Sandbox Code Playgroud)

Dav*_*ske 8

如果控件的大小发生变化,您可以使用InvalidateVisual(),但请记住,这会导致相当昂贵的UI重新布局.如果你的控件的大小保持不变,你不应该打电话InvalidateVisual().

更新UI的更有效方法是创建DrawingGroup"后备存储"并将其添加到DrawingContext期间OnRender().然后,您可以随时更新它,使用DrawingGroup.Open(),WPF将更新您的UI.

如果这听起来令人困惑,请记住WPF是一个保留的绘图系统.这意味着OnRender()可能更好地被称为AccumulateDrawingObjects().它实际上正在累积一个实时绘图对象树,其中一些(如DrawingGroup,RenderTargetBitmap和WriteableBitmap)可以在以后更新.

这就是它的样子:

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();            
}
Run Code Online (Sandbox Code Playgroud)


Ind*_*000 6

您的问题不明确,但根据我的理解,您似乎要求在更新绘图变量后刷新视觉效果的方法.更新绘图变量后,可以使用以下内容:

this.InvalidateVisual();
Run Code Online (Sandbox Code Playgroud)

和财产:

private int drawItem;
pulic int DrawItem
{
 get {return drawItem;}
 set 
 {
    drawItem=value;
    this.InvalidateVisual();
 }
}
Run Code Online (Sandbox Code Playgroud)