I want to draw something dynamically. Following code shows my OnRender. I\'m setting DrawItem somewhere in my program where I need it. But when I\'m calling DrawItem =
If the size of your control changes, you can use InvalidateVisual()
, however keep in mind this causes a fairly expensive re-layout of your UI. If the size of your control is staying the same, you shouldn't call InvalidateVisual()
.
A more efficient way to update your UI is to create a DrawingGroup
"backing store" and add it to the DrawingContext
during OnRender()
. You can then update it whenever you like, using DrawingGroup.Open()
, and WPF will update your UI.
If this sounds confusing, remember that WPF is a retained drawing system. That means OnRender()
might better be called AccumulateDrawingObjects()
. It's actually accumulating a tree of live drawing objects, some of which (like DrawingGroup, RenderTargetBitmap, and WriteableBitmap) can be updated later.
This is what it looks like:
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();
}