Пример #1
0
        /// <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();
                    }
                }
            }
        }
Пример #2
0
        /// <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();
            }
        }