/// <param name="needDetach">whether remove current context from render buffer</param> private async Task _UpdateAsync(GLVisual visual, bool needDetach = false) { if (visual.TryEnterUpdate()) { if (needDetach) { _DetachVisual(visual); // remove current context from render buffer but not clear itself (for hittest) } await visual.UpdateAsync(); // context has been swapped visual.BackContext?.Clear(); // so we clear back context // has been deleted when updating ? if (!visual.IsDeleted) // not deleted { _AttachVisual(visual); // add current context to render buffer if (!visual.TryExitUpdate()) { await _UpdateAsync(visual, true); } } else // has been deleted { visual.Reset(); // reset visual visual.Panel = null; // disconnect from panel visual.ExitUpdate(); // endup updating !!!!! if (visual.NeedDispose) { visual.Dispose(); } } } }
/// <summary> /// Remove a visual /// </summary> /// <param name="visual">The visual to remove</param> /// <param name="refresh">Whether to refresh the frame buffer immediately</param> public void RemoveVisual(GLVisual visual, bool refresh = true) { MakeSureCurrentContext(_context); if (visual.Panel != this) { throw new InvalidOperationException("Logical parent error!"); } _DetachVisual(visual); _RemoveVisual(visual); if (!visual.IsUpdating) { visual.Reset(); visual.Panel = null; } if (refresh) { _Refresh(); } }