Вы не должны использовать InvalidateVisual()
, если только размер вашего элемента управления не изменится, так как это вызывает довольно дорогую перестройку вашего пользовательского интерфейса.
WPF - это сохраненная система рисования. Это означает, что OnRender()
лучше называть AccumulateDrawingObjects()
. Это на самом деле накапливает дерево живых объектов рисования, которое должно происходить только один раз за макет. Затем он использует эти объекты для рисования вашего пользовательского интерфейса всякий раз, когда это необходимо. Чтобы изменить внешний вид части вашего пользовательского интерфейса без изменения макета, некоторые объекты (такие как DrawingGroup, RenderTargetBitmap и WriteableBitmap) можно обновить после OnRender()
в любое время.
Чтобы обновить часть вашего пользовательского интерфейса позже, оберните эти команды в DrawingGroup
и поместите этот объект в DrawingContext
. Затем вы можете 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();
}