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