public static IVisualElementRenderer GetOrCreateRenderer(this VisualElement bindable)
        {
            var renderer = XFPlatform.GetRenderer(bindable);

            if (renderer == null)
            {
                renderer = XFPlatform.CreateRenderer(bindable);
                XFPlatform.SetRenderer(bindable, renderer);
            }
            return(renderer);
        }
        void UpdateContent()
        {
            if (_renderer != null)
            {
                _renderer.View.RemoveFromParent();
                _renderer.Dispose();
                _renderer = null;
            }

            if (RefreshView.Content != null)
            {
                _renderer = Platform.CreateRenderer(RefreshView.Content, Context);

                Platform.SetRenderer(RefreshView.Content, _renderer);

                if (_renderer.View.Parent != null)
                {
                    _renderer.View.RemoveFromParent();
                }

                using (var layoutParams = new LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent))
                    SwipeRefreshLayout.AddView(_renderer.View, layoutParams);
            }
        }
Example #3
0
        Task <bool> SwitchContentAsync(Page view, bool animated, bool removed = false)
        {
            Context.HideKeyboard(this);

            IVisualElementRenderer rendererToAdd = Platform.GetRenderer(view);
            bool existing = rendererToAdd != null;

            if (!existing)
            {
                Platform.SetRenderer(view, rendererToAdd = Platform.CreateRenderer(view));
            }

            Page pageToRemove = _current;
            IVisualElementRenderer rendererToRemove  = pageToRemove == null ? null : Platform.GetRenderer(pageToRemove);
            PageContainer          containerToRemove = rendererToRemove == null ? null : (PageContainer)rendererToRemove.ViewGroup.Parent;
            PageContainer          containerToAdd    = (PageContainer)rendererToAdd.ViewGroup.Parent ?? new PageContainer(Context, rendererToAdd);

            containerToAdd.SetWindowBackground();

            _current = view;

            ((Platform)Element.Platform).NavAnimationInProgress = true;

            var tcs = new TaskCompletionSource <bool>();

            if (animated)
            {
                if (s_currentAnimation != null)
                {
                    s_currentAnimation.Cancel();
                }

                if (removed)
                {
                    // animate out
                    if (containerToAdd.Parent != this)
                    {
                        AddView(containerToAdd, Element.LogicalChildren.IndexOf(rendererToAdd.Element));
                    }
                    else
                    {
                        ((Page)rendererToAdd.Element).SendAppearing();
                    }
                    containerToAdd.Visibility = ViewStates.Visible;

                    if (containerToRemove != null)
                    {
                        Action <AndroidAnimation.Animator> done = a =>
                        {
                            containerToRemove.Visibility = ViewStates.Gone;
                            containerToRemove.Alpha      = 1;
                            containerToRemove.ScaleX     = 1;
                            containerToRemove.ScaleY     = 1;
                            RemoveView(containerToRemove);

                            tcs.TrySetResult(true);
                            ((Platform)Element.Platform).NavAnimationInProgress = false;

                            VisualElement removedElement = rendererToRemove.Element;
                            rendererToRemove.Dispose();
                            if (removedElement != null)
                            {
                                Platform.SetRenderer(removedElement, null);
                            }
                        };

                        // should always happen
                        s_currentAnimation = containerToRemove.Animate().Alpha(0).ScaleX(0.8f).ScaleY(0.8f).SetDuration(250).SetListener(new GenericAnimatorListener {
                            OnEnd = a =>
                            {
                                s_currentAnimation = null;
                                done(a);
                            },
                            OnCancel = done
                        });
                    }
                }
                else
                {
                    bool containerAlreadyAdded = containerToAdd.Parent == this;
                    // animate in
                    if (!containerAlreadyAdded)
                    {
                        AddView(containerToAdd);
                    }
                    else
                    {
                        ((Page)rendererToAdd.Element).SendAppearing();
                    }

                    if (existing)
                    {
                        Element.ForceLayout();
                    }

                    containerToAdd.Alpha      = 0;
                    containerToAdd.ScaleX     = containerToAdd.ScaleY = 0.8f;
                    containerToAdd.Visibility = ViewStates.Visible;
                    s_currentAnimation        = containerToAdd.Animate().Alpha(1).ScaleX(1).ScaleY(1).SetDuration(250).SetListener(new GenericAnimatorListener {
                        OnEnd = a =>
                        {
                            if (containerToRemove != null && containerToRemove.Handle != IntPtr.Zero)
                            {
                                containerToRemove.Visibility = ViewStates.Gone;
                                if (pageToRemove != null)
                                {
                                    pageToRemove.SendDisappearing();
                                }
                            }
                            s_currentAnimation = null;
                            tcs.TrySetResult(true);
                            ((Platform)Element.Platform).NavAnimationInProgress = false;
                        }
                    });
                }
            }
            else
            {
                // just do it fast
                if (containerToRemove != null)
                {
                    if (removed)
                    {
                        RemoveView(containerToRemove);
                    }
                    else
                    {
                        containerToRemove.Visibility = ViewStates.Gone;
                    }
                }

                if (containerToAdd.Parent != this)
                {
                    AddView(containerToAdd);
                }
                else
                {
                    ((Page)rendererToAdd.Element).SendAppearing();
                }

                if (containerToRemove != null && !removed)
                {
                    pageToRemove.SendDisappearing();
                }

                if (existing)
                {
                    Element.ForceLayout();
                }

                containerToAdd.Visibility = ViewStates.Visible;
                tcs.SetResult(true);
                ((Platform)Element.Platform).NavAnimationInProgress = false;
            }

            return(tcs.Task);
        }
Example #4
0
 public static IVisualElementRenderer GetRenderer(VisualElement view)
 {
     return(Platform.CreateRenderer(view));
 }
Example #5
0
            public void Update(ViewCell cell)
            {
                Performance.Start();

                var renderer        = GetChildAt(0) as IVisualElementRenderer;
                var viewHandlerType = Registrar.Registered.GetHandlerTypeForObject(cell.View) ?? typeof(Platform.DefaultRenderer);
                var reflectableType = renderer as System.Reflection.IReflectableType;
                var rendererType    = reflectableType != null?reflectableType.GetTypeInfo().AsType() : (renderer != null ? renderer.GetType() : typeof(System.Object));

                if (renderer != null && rendererType == viewHandlerType)
                {
                    Performance.Start("Reuse");
                    _viewCell = cell;

                    cell.View.DisableLayout = true;
                    foreach (VisualElement c in cell.View.Descendants())
                    {
                        c.DisableLayout = true;
                    }

                    Performance.Start("Reuse.SetElement");
                    renderer.SetElement(cell.View);
                    Performance.Stop("Reuse.SetElement");

                    Platform.SetRenderer(cell.View, _view);

                    cell.View.DisableLayout = false;
                    foreach (VisualElement c in cell.View.Descendants())
                    {
                        c.DisableLayout = false;
                    }

                    var viewAsLayout = cell.View as Layout;
                    if (viewAsLayout != null)
                    {
                        viewAsLayout.ForceLayout();
                    }

                    Invalidate();

                    Performance.Stop("Reuse");
                    Performance.Stop();
                    return;
                }

                RemoveView(_view.View);
                Platform.SetRenderer(_viewCell.View, null);
                _viewCell.View.IsPlatformEnabled = false;
                _view.View.Dispose();

                _viewCell = cell;
                _view     = Platform.CreateRenderer(_viewCell.View, Context);

                Platform.SetRenderer(_viewCell.View, _view);
                AddView(_view.View);

                UpdateIsEnabled();
                UpdateWatchForLongPress();

                Performance.Stop();
            }
Example #6
0
        protected virtual void AddChildView(VisualElement childView)
        {
            _pageContainer = null;

            Page page = childView as NavigationPage ?? (Page)(childView as TabbedPage);

            if (page == null)
            {
                // The thing we're adding is not a NavigationPage or TabbedPage, so we can just use the old AddChildView

                if (_currentFragment != null)
                {
                    if (!_parent.IsAttachedToRoot())
                    {
                        return;
                    }

                    // But first, if the previous occupant of this container was a fragment, we need to remove it properly
                    FragmentTransaction transaction = FragmentManager.BeginTransactionEx();
                    transaction.RemoveEx(_currentFragment);
                    transaction.SetTransitionEx((int)FragmentTransit.None);

                    if (IsAttachedToWindow)
                    {
                        ExecuteTransaction(transaction);
                    }
                    else
                    {
                        _transaction = transaction;
                    }

                    _currentFragment = null;
                }

                IVisualElementRenderer renderer = Platform.GetRenderer(childView);
                if (renderer == null)
                {
                    Platform.SetRenderer(childView, renderer = Platform.CreateRenderer(childView, Context));
                }

                if (renderer.View.Parent != this)
                {
                    if (renderer.View.Parent != null)
                    {
                        renderer.View.RemoveFromParent();
                    }
                    SetDefaultBackgroundColor(renderer);
                    AddView(renderer.View);
                    renderer.UpdateLayout();
                }
            }
            else
            {
                if (!_parent.IsAttachedToRoot())
                {
                    return;
                }

                // The renderers for NavigationPage and TabbedPage both host fragments, so they need to be wrapped in a
                // FragmentContainer in order to get isolated fragment management
                Fragment fragment = FragmentContainer.CreateInstance(page);

                var fc = fragment as FragmentContainer;

                fc?.SetOnCreateCallback(pc =>
                {
                    _pageContainer = pc;
                    UpdateFlowDirection();
                    SetDefaultBackgroundColor(pc.Child);
                });

                FragmentTransaction transaction = FragmentManager.BeginTransactionEx();

                if (_currentFragment != null)
                {
                    transaction.RemoveEx(_currentFragment);
                }

                transaction.AddEx(Id, fragment);
                transaction.SetTransitionEx((int)FragmentTransit.None);

                if (IsAttachedToWindow)
                {
                    ExecuteTransaction(transaction);
                }
                else
                {
                    _transaction = transaction;
                }

                _currentFragment = fragment;
            }
        }