Очень важно понимать, что WPF не похож на Windows.Forms. OnRender()
действительно нужно назвать AccumulateDrawingObjects()
, потому что это то, что он делает. WPF накапливает кучу объектов рисования, которые он сохраняет, чтобы иметь возможность рисовать пользовательский интерфейс, когда это необходимо. Магия эффективного обновления пользовательского интерфейса заключается в том, что вы можете изменять объекты в этом визуальном дереве после OnRender()
.
Например, вы можете создать DrawingGroup
«backingStore» и поместить его в DrawingContext
во время OnRender
. Затем в любое время, когда вы захотите изменить визуальный элемент, вы можете DrawingGroup.Open()
, добавить в него новые команды рисования, и WPF будет эффективно повторно визуализировать эту часть интерфейса.
Это выглядит так:
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();
}