gpt4 book ai didi

c# - wpf渲染同步

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:49 25 4
gpt4 key购买 nike

我有两个自定义 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com