Пример #1
0
        void UpdateCell(ViewCell cell)
        {
            if (_viewCell != null)
            {
                Device.BeginInvokeOnMainThread(_viewCell.SendDisappearing);
            }

            _viewCell = cell;

            Device.BeginInvokeOnMainThread(_viewCell.SendAppearing);

            IVisualElementRenderer renderer;

            if (_rendererRef == null || !_rendererRef.TryGetTarget(out renderer))
            {
                renderer = GetNewRenderer();
            }
            else
            {
                if (renderer.Element != null && renderer == Platform.GetRenderer(renderer.Element))
                {
                    renderer.Element.ClearValue(Platform.RendererProperty);
                }

                var type            = Internals.Registrar.Registered.GetHandlerTypeForObject(_viewCell.View);
                var reflectableType = renderer as System.Reflection.IReflectableType;
                var rendererType    = reflectableType != null?reflectableType.GetTypeInfo().AsType() : renderer.GetType();

                if (rendererType == type || (renderer is DefaultRenderer && type == null))
                {
                    renderer.SetElement(_viewCell.View);
                }
                else
                {
                    //when cells are getting reused the element could be already set to another cell
                    //so we should dispose based on the renderer and not the renderer.Element
                    Platform.DisposeRendererAndChildren(renderer);
                    renderer = GetNewRenderer();
                }
            }

            Platform.SetRenderer(_viewCell.View, renderer);
        }
Пример #2
0
        void UpdateCell(ViewCell cell)
        {
            ICellController cellController = _viewCell;

            if (cellController != null)
            {
                Device.BeginInvokeOnMainThread(cellController.SendDisappearing);
            }

            _viewCell      = cell;
            cellController = cell;

            Device.BeginInvokeOnMainThread(cellController.SendAppearing);

            IVisualElementRenderer renderer;

            if (_rendererRef == null || !_rendererRef.TryGetTarget(out renderer))
            {
                renderer = GetNewRenderer();
            }
            else
            {
                if (renderer.Element != null && renderer == Platform.GetRenderer(renderer.Element))
                {
                    renderer.Element.ClearValue(Platform.RendererProperty);
                }

                var type = Registrar.Registered.GetHandlerType(_viewCell.View.GetType());
                if (renderer.GetType() == type || (renderer is DefaultRenderer && type == null))
                {
                    renderer.SetElement(_viewCell.View);
                }
                else
                {
                    //when cells are getting reused the element could be already set to another cell
                    //so we should dispose based on the renderer and not the renderer.Element
                    Platform.DisposeRendererAndChildren(renderer);
                    renderer = GetNewRenderer();
                }
            }

            Platform.SetRenderer(_viewCell.View, renderer);
        }
        async Task <bool> PopPageAsync(Page page, bool animated)
        {
            if (page == null)
            {
                throw new ArgumentNullException(nameof(page));
            }

            var wrapper = _currentStack.Peek();

            if (page != wrapper.Page)
            {
                throw new NotSupportedException("Popped page does not appear on top of current navigation stack, please file a bug.");
            }

            _currentStack.Pop();
            page.SendDisappearing();

            var target       = Platform.GetRenderer(page);
            var previousPage = _currentStack.Peek().Page;

            if (animated)
            {
                var previousPageRenderer = Platform.GetRenderer(previousPage);
                var transitionStyle      = NavigationPage.OnThisPlatform().GetNavigationTransitionPopStyle();

                return(await this.HandleAsyncAnimation(target.ViewController, previousPageRenderer.ViewController,
                                                       ToViewControllerTransitionOptions(transitionStyle), () => Platform.DisposeRendererAndChildren(target), true));
            }

            RemovePage(page, false);
            return(true);
        }