c# - wpf渲染同步

标签 c# wpf rendering

我有两个自定义 WPF 控件(具有自定义渲染逻辑),彼此放置在一起(透明背景和其他内容)。在某些时候我想重新绘制这些控件。我的第一个想法是打电话:

foreach(var control in Controls)
{
    control.InvalidateVisual();
}

但这并没有完全奏效。我的意思是它确实强制渲染我的控件,但视觉更新不会同时发生。控件逐一更新,这看起来不太好,并且可能会导致困惑(如果一个控件显示更新的视觉效果,而另一个控件仍然显示旧的视觉效果)。关于 InvalidateVisual 方法的文档确实很差,但我猜它是一个异步方法,这就是我遇到这个问题的原因。

那么问题来了:有没有办法同步多个控件的渲染呢?除了创建一个包含所有渲染逻辑的大型控件(我想避免这种情况)。

最佳答案

您通常不应使用InvalidateVisual()

要更新保持相同大小的控件,您可以创建一个 DrawingGroup 并在 OnRender() 期间将其放入视觉树中 - 然后您可以您可以随时使用 DrawingGroup.Open() 更新绘图组,WPF 将更新 UI。

对于您的情况,这看起来像:

class Control1 : UIElement {
    DrawingGroup backingStore = new DrawingGroup();

    protected override void OnRender(DrawingContext drawingContext) {      
        base.OnRender(drawingContext);            

        Render(); // put content into our backingStore
        drawingContext.DrawDrawing(backingStore);
    }
    private void Render() {            
        var drawingContext = backingStore.Open();
        Render(drawingContext);
        drawingContext.Close();            
    }
    private void Render(DrawingContext) {
        // put your existing drawing commands here.
    }

}

class Control2 : UIElement {
    DrawingGroup backingStore = new DrawingGroup();

    protected override void OnRender(DrawingContext drawingContext) {      
        base.OnRender(drawingContext);            

        Render(); // put content into our backingStore
        drawingContext.DrawDrawing(backingStore);
    }
    private void Render() {            
        var drawingContext = backingStore.Open();
        Render(drawingContext);
        drawingContext.Close();            
    }
    private void Render(DrawingContext) {
        // put your existing drawing commands here.
    }

}


class SomeOtherClass {
    public void SomeOtherMethod() {
         control1.Render();
         control2.Render();
    }

}    

关于c# - wpf渲染同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259354/

相关文章:

c# - GUI 启动时的控制台 "Hangs"

c# - 获取用户在 MSAGL 中点击的 Vertex(Node) Object

c# - Wpf 绝对与相对包 URI

c++ - OpenGL 全屏渲染

c# - 在不同行显示不同标签

c# - 不清晰的转换图像。 wmf转png

c# - 消除代码隐藏中的 Storyboard Completed 处理程序

c# - 使用正则表达式常量返回两个标签之间的字符串

java - 是否有用于使用体素引擎进行渲染的 Java 库?

graphics - directx 中多种复杂对象的典型渲染策略?