コード例 #1
1
		public override AView OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
		{
			if (Page != null)
			{
				_visualElementRenderer = Android.Platform.CreateRenderer(Page, ChildFragmentManager);
				Android.Platform.SetRenderer(Page, _visualElementRenderer);

				_pageContainer = new PageContainer(Forms.Context, _visualElementRenderer, true);
				return _pageContainer;
			}

			return null;
		}
コード例 #2
0
		public VisualElementPackager(IVisualElementRenderer renderer, int row = 0, int rowSpan = 0, int column = 0, int columnSpan = 0) : this(renderer)
		{
			_row = row;
			_rowSpan = rowSpan;
			_column = column;
			_columnSpan = columnSpan;
		}
コード例 #3
0
        public static void SetRenderer(BindableObject bindable, IVisualElementRenderer value)
        {
            var assembly = Assembly.Load("Xamarin.Forms.Platform.iOS");
            var type = assembly.GetType("Xamarin.Forms.Platform.iOS.Platform");

            var method = type.GetMethod("SetRenderer", BindingFlags.Public | BindingFlags.Static);

            method.Invoke(null, new Object[] { bindable, value });
        }
コード例 #4
0
		public VisualElementPackager(IVisualElementRenderer renderer)
		{
			if (renderer == null)
				throw new ArgumentNullException("renderer");

			Renderer = renderer;
			renderer.ElementChanged += OnRendererElementChanged;
			SetElement(null, renderer.Element);
		}
コード例 #5
0
		internal ModalWrapper(IVisualElementRenderer modal)
		{
			_modal = modal;

			View.BackgroundColor = UIColor.White;
			View.AddSubview(modal.ViewController.View);
			AddChildViewController(modal.ViewController);

			modal.ViewController.DidMoveToParentViewController(this);
		}
コード例 #6
0
ファイル: EventTracker.cs プロジェクト: Costo/Xamarin.Forms
		public EventTracker(IVisualElementRenderer renderer)
		{
			if (renderer == null)
				throw new ArgumentNullException("renderer");

			_collectionChangedHandler = ModelGestureRecognizersOnCollectionChanged;

			_renderer = renderer;
			_renderer.ElementChanged += OnElementChanged;
		}
コード例 #7
0
ファイル: RendererPool.cs プロジェクト: Costo/Xamarin.Forms
		void PushRenderer(IVisualElementRenderer renderer)
		{
			Type rendererType = renderer.GetType();

			Stack<IVisualElementRenderer> renderers;
			if (!_freeRenderers.TryGetValue(rendererType, out renderers))
				_freeRenderers[rendererType] = renderers = new Stack<IVisualElementRenderer>();

			renderers.Push(renderer);
		}
コード例 #8
0
			public ViewCellContainer(Context context, IVisualElementRenderer view, ViewCell viewCell, View parent, BindableProperty unevenRows, BindableProperty rowHeight) : base(context)
			{
				_view = view;
				_parent = parent;
				_unevenRows = unevenRows;
				_rowHeight = rowHeight;
				_viewCell = viewCell;
				AddView(view.ViewGroup);
				UpdateIsEnabled();
			}
コード例 #9
0
		public RendererPool(IVisualElementRenderer renderer, VisualElement oldElement)
		{
			if (renderer == null)
				throw new ArgumentNullException("renderer");

			if (oldElement == null)
				throw new ArgumentNullException("oldElement");

			_oldElement = oldElement;
			_parent = renderer;
		}
コード例 #10
0
		public VisualElementPackager(IVisualElementRenderer renderer)
		{
			if (renderer == null)
				throw new ArgumentNullException("renderer");

			_panel = renderer.ContainerElement as Panel;
			if (_panel == null)
				throw new ArgumentException("Renderer's container element must be a Panel or Panel subclass");

			_renderer = renderer;
		}
コード例 #11
0
		public VisualElementPackager(IVisualElementRenderer renderer)
		{
			if (renderer == null)
				throw new ArgumentNullException("renderer");

			_childAddedHandler = OnChildAdded;
			_childRemovedHandler = OnChildRemoved;
			_childReorderedHandler = OnChildrenReordered;

			_renderer = renderer;
			_renderer.ElementChanged += (sender, args) => SetElement(args.OldElement, args.NewElement);
		}
コード例 #12
0
		public VisualElementTracker(IVisualElementRenderer renderer)
		{
			if (renderer == null)
				throw new ArgumentNullException("renderer");

			_propertyChangedHandler = HandlePropertyChanged;
			_sizeChangedEventHandler = HandleSizeChanged;
			_batchCommittedHandler = HandleRedrawNeeded;

			Renderer = renderer;
			renderer.ElementChanged += OnRendererElementChanged;
			SetElement(null, renderer.Element);
		}
コード例 #13
0
		public void Dispose()
		{
			if (_disposed)
				return;
			_disposed = true;

			SetElement(_element, null);

			if (_renderer != null)
			{
				_renderer.ElementChanged -= RendererOnElementChanged;
				_renderer.ViewGroup.RemoveOnAttachStateChangeListener(AttachTracker.Instance);
				_renderer = null;
				_context = null;
			}
		}
コード例 #14
0
		protected virtual void Dispose(bool disposing)
		{
			if (_isDisposed)
				return;

			if (disposing)
			{
				SetElement(_element, null);
				if (Renderer != null)
				{
					Renderer.ElementChanged -= OnRendererElementChanged;
					Renderer = null;
				}
			}

			_isDisposed = true;
		}
コード例 #15
0
		public VisualElementTracker(IVisualElementRenderer renderer)
		{
			if (renderer == null)
				throw new ArgumentNullException("renderer");

			_batchCommittedHandler = HandleRedrawNeeded;
			_propertyChangedHandler = HandlePropertyChanged;

			_renderer = renderer;
			_context = renderer.ViewGroup.Context;
			_renderer.ElementChanged += RendererOnElementChanged;

			VisualElement view = renderer.Element;
			SetElement(null, view);

			renderer.ViewGroup.SetCameraDistance(3600);

			renderer.ViewGroup.AddOnAttachStateChangeListener(AttachTracker.Instance);
		}
コード例 #16
0
		void ClearRenderers(IVisualElementRenderer renderer)
		{
			if (renderer == null)
				return;

			var subviews = renderer.NativeView.Subviews;
			for (var i = 0; i < subviews.Length; i++)
			{
				var childRenderer = subviews[i] as IVisualElementRenderer;
				if (childRenderer != null)
				{
					PushRenderer(childRenderer);

					if (ReferenceEquals(childRenderer, Platform.GetRenderer(childRenderer.Element)))
						childRenderer.Element.ClearValue(Platform.RendererProperty);
				}

				subviews[i].RemoveFromSuperview();
			}
		}
コード例 #17
0
		protected virtual void Dispose(bool disposing)
		{
			if (_disposed)
				return;

			_disposed = true;

			if (disposing)
			{
				SetElement(_element, null);

				if (_layer != null)
				{
					_layer.Dispose();
					_layer = null;
				}

				Renderer.ElementChanged -= OnRendererElementChanged;
				Renderer = null;
			}
		}
コード例 #18
0
		public void Dispose()
		{
			if (_disposed)
				return;
			_disposed = true;

			if (_renderer != null)
			{
				if (_childViews != null)
				{
					_childViews.Clear();
					_childViews = null;
				}

				_renderer.Element.ChildAdded -= _childAddedHandler;
				_renderer.Element.ChildRemoved -= _childRemovedHandler;

				_renderer.Element.ChildrenReordered -= _childReorderedHandler;
				_renderer = null;
			}
		}
コード例 #19
0
		public override void OnDestroyView()
		{
			if (Page != null)
			{
				IVisualElementRenderer renderer = _visualElementRenderer;
				PageContainer container = _pageContainer;

				if (container.Handle != IntPtr.Zero && renderer.ViewGroup.Handle != IntPtr.Zero)
				{
					container.RemoveFromParent();
					renderer.ViewGroup.RemoveFromParent();
					Page.ClearValue(Android.Platform.RendererProperty);

					container.Dispose();
					renderer.Dispose();
				}
			}

			_visualElementRenderer = null;
			_pageContainer = null;

			base.OnDestroyView();
		}
コード例 #20
0
		void AddChild(VisualElement view, IVisualElementRenderer oldRenderer = null, RendererPool pool = null, bool sameChildren = false)
		{
			Performance.Start();

			if (_childViews == null)
				_childViews = new List<IVisualElementRenderer>();

			IVisualElementRenderer renderer = oldRenderer;
			if (pool != null)
				renderer = pool.GetFreeRenderer(view);
			if (renderer == null)
			{
				Performance.Start("New renderer");
				renderer = Platform.CreateRenderer(view);
				Performance.Stop("New renderer");
			}

			if (renderer == oldRenderer)
			{
				Platform.SetRenderer(renderer.Element, null);
				renderer.SetElement(view);
			}

			Performance.Start("Set renderer");
			Platform.SetRenderer(view, renderer);
			Performance.Stop("Set renderer");

			Performance.Start("Add view");
			if (!sameChildren)
			{
				_renderer.ViewGroup.AddView(renderer.ViewGroup);
				_childViews.Add(renderer);
			}
			Performance.Stop("Add view");

			Performance.Stop();
		}
コード例 #21
0
        void SetElement(VisualElement oldElement, VisualElement newElement)
        {
            Performance.Start(out string reference);

            var sameChildrenTypes = false;

            ReadOnlyCollection <Element> newChildren = null, oldChildren = null;

            RendererPool pool = null;

            if (oldElement != null)
            {
                oldElement.ChildAdded        -= _childAddedHandler;
                oldElement.ChildRemoved      -= _childRemovedHandler;
                oldElement.ChildrenReordered -= _childReorderedHandler;

                oldChildren = ((IElementController)oldElement).LogicalChildren;

                if (newElement != null)
                {
                    sameChildrenTypes = true;

                    newChildren = ((IElementController)newElement).LogicalChildren;

                    if (oldChildren.Count == newChildren.Count)
                    {
                        for (var i = 0; i < oldChildren.Count; i++)
                        {
                            if (oldChildren[i].GetType() != newChildren[i].GetType())
                            {
                                sameChildrenTypes = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        sameChildrenTypes = false;
                    }
                }
                else
                {
                    for (var i = 0; i < oldChildren.Count; i++)
                    {
                        RemoveChild((VisualElement)oldChildren[i]);
                    }
                }

                if (!sameChildrenTypes)
                {
                    _childViews = new List <IVisualElementRenderer>();
                    pool        = new RendererPool(_renderer, oldElement);
                    pool.ClearChildrenRenderers();
                }
            }

            if (newElement != null)
            {
                Performance.Start(reference, "Setup");

                newElement.ChildAdded   += _childAddedHandler;
                newElement.ChildRemoved += _childRemovedHandler;

                newElement.ChildrenReordered += _childReorderedHandler;

                newChildren = newChildren ?? ((IElementController)newElement).LogicalChildren;

                for (var i = 0; i < newChildren.Count; i++)
                {
                    IVisualElementRenderer oldRenderer = null;
                    if (oldChildren != null && sameChildrenTypes && _childViews != null)
                    {
                        oldRenderer = _childViews[i];
                    }

                    AddChild((VisualElement)newChildren[i], oldRenderer, pool, sameChildrenTypes);
                }

#if DEBUG
                //if (renderer.Element.LogicalChildren.Any() && renderer.ViewGroup.ChildCount != renderer.Element.LogicalChildren.Count)
                //	throw new InvalidOperationException ("SetElement did not create the correct number of children");
#endif
                EnsureChildOrder();
                Performance.Stop(reference, "Setup");
            }

            Performance.Stop(reference);
        }
コード例 #22
0
		protected void SetDefaultBackgroundColor(IVisualElementRenderer renderer)
		{
			if (ChildView.BackgroundColor == Color.Default)
			{
				TypedArray colors = Context.Theme.ObtainStyledAttributes(new[] { global::Android.Resource.Attribute.ColorBackground });
				renderer.ViewGroup.SetBackgroundColor(new global::Android.Graphics.Color(colors.GetColor(0, 0)));
			}
		}
コード例 #23
0
        protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
        {
            if (Element == null || finalSize.Width * finalSize.Height == 0)
            {
                return(finalSize);
            }

            Element.IsInNativeLayout = true;

            var myRect = new Rect(0, 0, finalSize.Width, finalSize.Height);

            if (Control != null)
            {
                Control.Arrange(myRect);
            }

            List <UIElement> arrangedChildren = null;

            for (var i = 0; i < ElementController.LogicalChildren.Count; i++)
            {
                var child = ElementController.LogicalChildren[i] as VisualElement;
                if (child == null)
                {
                    continue;
                }
                IVisualElementRenderer renderer = Platform.GetRenderer(child);
                if (renderer == null)
                {
                    continue;
                }
                Rectangle bounds = child.Bounds;

                renderer.ContainerElement.Arrange(new Rect(bounds.X, bounds.Y, Math.Max(0, bounds.Width), Math.Max(0, bounds.Height)));

                if (ArrangeNativeChildren)
                {
                    if (arrangedChildren == null)
                    {
                        arrangedChildren = new List <UIElement>();
                    }
                    arrangedChildren.Add(renderer.ContainerElement);
                }
            }

            if (ArrangeNativeChildren)
            {
                // in the event that a custom renderer has added native controls,
                // we need to be sure to arrange them so that they are laid out.
                var nativeChildren = Children;
                for (int i = 0; i < nativeChildren.Count; i++)
                {
                    var nativeChild = nativeChildren[i];
                    if (arrangedChildren?.Contains(nativeChild) == true)
                    {
                        // don't try to rearrange renderers that were just arranged,
                        // lest you suffer a layout cycle
                        continue;
                    }
                    else
                    {
                        nativeChild.Arrange(myRect);
                    }
                }
            }

            Element.IsInNativeLayout = false;

            return(finalSize);
        }
コード例 #24
0
ファイル: FlyoutPageContainer.cs プロジェクト: zhamppx97/maui
        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 = APlatform.GetRenderer(childView);
                if (renderer == null)
                {
                    APlatform.SetRenderer(childView, renderer = APlatform.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;
            }
        }
コード例 #25
0
        internal EditText GetEditText(IVisualElementRenderer renderer)
        {
            var viewGroup = renderer?.View as ViewGroup;

            return(viewGroup?.GetChildAt(0) as EditText);
        }
コード例 #26
0
 public static void SetRenderer(BindableObject bindableObject, IVisualElementRenderer renderer)
 {
     var value = bindableObject.GetValue (RendererProperty);
     bindableObject.SetValue (RendererProperty, renderer);
 }
コード例 #27
0
			void NotifyWrapperAwareDescendants(Element currentView, IVisualElementRenderer currentRenderer)
			{
				// If any of the child renderers need to handle anything differently because they're in 
				// a wrapper in a list view, let them know that they're being wrapped
				var wrapperAwareRenderer = currentRenderer as IWrapperAware;
				wrapperAwareRenderer?.NotifyWrapped();

				foreach (Element child in currentView.LogicalChildren)
				{
					var childView = child as View;
					if (childView == null)
					{
						continue;
					}

					NotifyWrapperAwareDescendants(childView, Platform.GetRenderer(childView));
				}
			}
コード例 #28
0
        public UIDragItem[] HandleDragStarting(View element, IVisualElementRenderer renderer)
        {
            UIDragItem[] returnValue = null;
            SendEventArgs <DragGestureRecognizer>(rec =>
            {
                if (!rec.CanDrag)
                {
                    return;
                }

                var args = rec.SendDragStarting(element);

                if (args.Cancel)
                {
                    return;
                }

                if (!args.Handled)
                {
                    UIImage uIImage             = null;
                    string clipDescription      = String.Empty;
                    NSItemProvider itemProvider = null;

                    if (renderer is IImageVisualElementRenderer iver)
                    {
                        uIImage = iver.GetImage()?.Image;
                        if (uIImage != null)
                        {
                            itemProvider = new NSItemProvider(uIImage);
                        }
                        else
                        {
                            itemProvider = new NSItemProvider(new NSString(""));
                        }

                        if (args.Data.Image == null && renderer.Element is IImageElement imageElement)
                        {
                            args.Data.Image = imageElement.Source;
                        }
                    }
                    else
                    {
                        string text = args.Data.Text ?? clipDescription;

                        if (String.IsNullOrWhiteSpace(text))
                        {
                            itemProvider = new NSItemProvider(renderer.NativeView.ConvertToImage());
                        }
                        else
                        {
                            itemProvider = new NSItemProvider(new NSString(text));
                        }
                    }

                    var dragItem         = new UIDragItem(itemProvider);
                    dragItem.LocalObject = new CustomLocalStateData()
                    {
                        Renderer    = renderer,
                        View        = renderer.Element as View,
                        DataPackage = args.Data
                    };

                    returnValue = new UIDragItem[] { dragItem };
                }
            },
                                                  element);

            return(returnValue ?? new UIDragItem[0]);
        }
コード例 #29
0
 public SizedItemContentView(IVisualElementRenderer content, Context context, Func <int> width, Func <int> height)
     : base(content, context)
 {
     _width  = width;
     _height = height;
 }
コード例 #30
0
        void AddMenu()
        {
            if (_basePage == null)
            {
                return;
            }
            var menu = _basePage.SlideMenu;

            if (menu == null)
            {
                return;
            }

            _basePage.HideMenuAction = () => {
                if (_dragGesture == null)
                {
                    return;
                }
                var rect = _dragGesture.GetHidePosition();
                _popMenuOverlayRenderer.ViewGroup.Animate()
                .X((float)rect.left)
                .Y((float)rect.top)
                .SetDuration(menu.AnimationDurationMillisecond)
                .SetListener(new AnimatorListener(_dragGesture, false))
                .Start();
            };

            _basePage.ShowMenuAction = () => {
                if (_dragGesture == null)
                {
                    return;
                }
                var rect = _dragGesture.GetShowPosition();
                _popMenuOverlayRenderer.ViewGroup.Animate()
                .X((float)rect.left)
                .Y((float)rect.top)
                .SetDuration(menu.AnimationDurationMillisecond)
                .SetListener(new AnimatorListener(_dragGesture, true))
                .Start();
            };

            if (_popMenuOverlayRenderer == null)
            {
                _popMenuOverlayRenderer = RendererFactory.GetRenderer(menu);
                var metrics  = _pageRenderer.Resources.DisplayMetrics;
                var rootView = _popMenuOverlayRenderer.ViewGroup;
                if (_popMenuOverlayRenderer is SlideMenuDroidRenderer)
                {
                    _dragGesture = (_popMenuOverlayRenderer as SlideMenuDroidRenderer).GragGesture;
                }
                if (_dragGesture == null)
                {
                    return;
                }
                var rect = _dragGesture.GetHidePosition();

                menu.Layout(new Xamarin.Forms.Rectangle(
                                rect.left / metrics.Density,
                                rect.top / metrics.Density,
                                (rect.right - rect.left) / metrics.Density,
                                (rect.bottom - rect.top) / metrics.Density));

                _popMenuOverlayRenderer.UpdateLayout();
                _popMenuOverlayRenderer.ViewGroup.Visibility = ViewStates.Visible;
                rootView.Layout((int)rect.left, (int)rect.top, (int)rect.right, (int)rect.bottom);
                _pageRenderer.ViewGroup.AddView(rootView);
                _pageRenderer.ViewGroup.BringChildToFront(rootView);

                _dragGesture.NeedShowBackgroundView = (open, alpha) => {
                    if (open)
                    {
                        ShowBackgroundOverlay(alpha);
                    }
                    else
                    {
                        HideBackgroundOverlay();
                    }
                };
            }
        }
コード例 #31
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, ((IElementController)Element).LogicalChildren.IndexOf(rendererToAdd.Element));
                    }
                    else
                    {
                        ((IPageController)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
                    {
                        ((IPageController)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;
                                ((IPageController)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
                {
                    ((IPageController)rendererToAdd.Element).SendAppearing();
                }

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

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

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

            return(tcs.Task);
        }
コード例 #32
0
        protected override void Dispose(bool disposing)
        {
            if (disposing && !_disposed)
            {
                _disposed = true;

                if (_titleViewRenderer != null)
                {
                    Android.Platform.ClearRenderer(_titleViewRenderer.View);
                    _titleViewRenderer.Dispose();
                    _titleViewRenderer = null;
                }

                _toolbar.RemoveView(_titleView);
                _titleView?.Dispose();
                _titleView = null;

                _toolbar.RemoveView(_titleIconView);
                _titleIconView?.Dispose();
                _titleIconView = null;

                _imageSource = null;

                if (_toolbarTracker != null)
                {
                    _toolbarTracker.CollectionChanged -= ToolbarTrackerOnCollectionChanged;
                    _toolbarTracker.Target             = null;
                    _toolbarTracker = null;
                }

                if (_toolbar != null)
                {
                    _toolbar.SetNavigationOnClickListener(null);
                    _toolbar.Dispose();
                    _toolbar = null;
                }

                if (_drawerLayout != null && _drawerListener != null)
                {
                    _drawerLayout.RemoveDrawerListener(_drawerListener);
                }

                if (_drawerListener != null)
                {
                    _drawerListener.Dispose();
                    _drawerListener = null;
                }

                if (_drawerToggle != null)
                {
                    _drawerToggle.Dispose();
                    _drawerToggle = null;
                }

                if (_backgroundDrawable != null)
                {
                    _backgroundDrawable.Dispose();
                    _backgroundDrawable = null;
                }

                Current = null;

                // We dispose the child renderers after cleaning up everything related to DrawerLayout in case
                // one of the children is a MasterDetailPage (which may dispose of the DrawerLayout).
                if (Element != null)
                {
                    foreach (Element element in PageController.InternalChildren)
                    {
                        var child = element as VisualElement;
                        if (child == null)
                        {
                            continue;
                        }

                        IVisualElementRenderer renderer = Android.Platform.GetRenderer(child);
                        renderer?.Dispose();
                    }

                    var navController = NavigationPageController;

                    navController.PushRequested             -= OnPushed;
                    navController.PopRequested              -= OnPopped;
                    navController.PopToRootRequested        -= OnPoppedToRoot;
                    navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested;
                    navController.RemovePageRequested       -= OnRemovePageRequested;
                }

                Device.Info.PropertyChanged -= DeviceInfoPropertyChanged;

                // API only exists on newer android YAY
                if ((int)Build.VERSION.SdkInt >= 17)
                {
                    FragmentManager fm = FragmentManager;

                    if (!fm.IsDestroyed)
                    {
                        FragmentTransaction trans = fm.BeginTransactionEx();
                        foreach (Fragment fragment in _fragmentStack)
                        {
                            trans.RemoveEx(fragment);
                        }
                        trans.CommitAllowingStateLossEx();
                        fm.ExecutePendingTransactionsEx();
                    }
                }
            }

            base.Dispose(disposing);
        }
コード例 #33
0
 static bool IsDrawableSourceValid(this IVisualElementRenderer renderer, BindableObject bindable, out BindableObject element)
 {
     if ((renderer is IDisposedState disposed && disposed.IsDisposed) || (renderer != null && renderer.View == null))
     {
         element = null;
     }
コード例 #34
0
 public VisualElementPackager(IVisualElementRenderer renderer) : this(renderer, null)
 {
 }
コード例 #35
0
 public static void SetRenderer(VisualElement bindable, IVisualElementRenderer value)
 {
     bindable.SetValue(RendererProperty, value);
 }
コード例 #36
0
        protected void AddChildView(VisualElement childView)
        {
            IVisualElementRenderer renderer = Platform.GetOrCreateRenderer(childView);

            this.PackEnd(renderer.NativeView);
        }
コード例 #37
0
 public static void SetRenderer(VisualElement element, IVisualElementRenderer value)
 {
     element.SetValue(RendererProperty, value);
     element.IsPlatformEnabled = value != null;
 }
コード例 #38
0
        protected override void Dispose(bool disposing)
        {
            // check inset tracker for null to
            if (disposing && _insetTracker != null)
            {
                _insetTracker.Dispose();
                _insetTracker = null;

                var viewsToLookAt = new Stack <UIView>(Subviews);
                while (viewsToLookAt.Count > 0)
                {
                    var view             = viewsToLookAt.Pop();
                    var viewCellRenderer = view as ViewCellRenderer.ViewTableCell;
                    if (viewCellRenderer != null)
                    {
                        viewCellRenderer.Dispose();
                    }
                    else
                    {
                        foreach (var child in view.Subviews)
                        {
                            viewsToLookAt.Push(child);
                        }
                    }
                }

                if (Element != null)
                {
                    var templatedItems = TemplatedItemsView.TemplatedItems;
                    templatedItems.CollectionChanged        -= OnCollectionChanged;
                    templatedItems.GroupedCollectionChanged -= OnGroupedCollectionChanged;
                }

                if (_tableViewController != null)
                {
                    _tableViewController.Dispose();
                    _tableViewController = null;
                }
            }

            if (disposing)
            {
                if (_headerRenderer != null)
                {
                    var platform = _headerRenderer.Element.Platform as Platform;
                    if (platform != null)
                    {
                        platform.DisposeModelAndChildrenRenderers(_headerRenderer.Element);
                    }
                    _headerRenderer = null;
                }
                if (_footerRenderer != null)
                {
                    var platform = _footerRenderer.Element.Platform as Platform;
                    if (platform != null)
                    {
                        platform.DisposeModelAndChildrenRenderers(_footerRenderer.Element);
                    }
                    _footerRenderer = null;
                }

                var headerView = Controller?.HeaderElement as VisualElement;
                if (headerView != null)
                {
                    headerView.MeasureInvalidated -= OnHeaderMeasureInvalidated;
                }
                Control?.TableHeaderView?.Dispose();

                var footerView = Controller?.FooterElement as VisualElement;
                if (footerView != null)
                {
                    footerView.MeasureInvalidated -= OnFooterMeasureInvalidated;
                }
                Control?.TableFooterView?.Dispose();
            }

            base.Dispose(disposing);
        }
コード例 #39
0
ファイル: TabbedPageRenderer.cs プロジェクト: terrajobst/maui
        protected override void Dispose(bool disposing)
        {
            if (disposing && !_disposed)
            {
                _disposed = true;

                if (Element != null)
                {
                    PageController.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged;

                    foreach (Page pageToRemove in Element.Children)
                    {
                        TeardownPage(pageToRemove);
                    }
                }

                RemoveAllViews();

                if (_viewPager != null)
                {
                    _viewPager.ClearOnPageChangeListeners();
                    _viewPager.Adapter.Dispose();
                    _viewPager.Dispose();
                    _viewPager = null;
                }

                if (_tabLayout != null)
                {
                    _tabLayout.ClearOnTabSelectedListeners();
                    _tabLayout.Dispose();
                    _tabLayout = null;
                }

                if (_bottomNavigationView != null)
                {
                    _bottomNavigationView.SetOnNavigationItemSelectedListener(null);
                    _bottomNavigationView.Dispose();
                    _bottomNavigationView = null;
                }

                if (_relativeLayout != null)
                {
                    _relativeLayout.Dispose();
                    _relativeLayout = null;
                }

                if (Element != null)
                {
                    foreach (Page pageToRemove in Element.Children)
                    {
                        IVisualElementRenderer pageRenderer = Android.Platform.GetRenderer(pageToRemove);

                        pageRenderer?.Dispose();

                        pageToRemove.ClearValue(Android.Platform.RendererProperty);
                    }
                }

                _previousPage = null;
            }

            base.Dispose(disposing);
        }
        /// <summary>
        /// Managest adding and removing the android viewgroup to our actual swiperefreshlayout
        /// </summary>
        void UpdateContent()
        {
            if (RefreshView.Content == null)
                return;

            if (packed != null)
                RemoveView(packed.ViewGroup);

            packed = Platform.CreateRenderer(RefreshView.Content);

            try
            {
                RefreshView.Content.SetValue(RendererProperty, packed);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("Unable to sent renderer property, maybe an issue: " + ex);
            }

            AddView(packed.ViewGroup, LayoutParams.MatchParent);

        }
コード例 #41
0
ファイル: Platform.cs プロジェクト: Costo/Xamarin.Forms
			public ModalContainer(Context context, Page modal) : base(context)
			{
				_modal = modal;

				_backgroundView = new global::Android.Views.View(context);
				_backgroundView.SetWindowBackground();
				AddView(_backgroundView);

				Android.Platform.SetPageContext(modal, context);
				_renderer = Android.Platform.CreateRenderer(modal);
				Android.Platform.SetRenderer(modal, _renderer);

				AddView(_renderer.ViewGroup);
			}
コード例 #42
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);

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

                UpdateIsEnabled();
                UpdateWatchForLongPress();

                Performance.Stop();
            }
コード例 #43
0
ファイル: Platform.cs プロジェクト: Costo/Xamarin.Forms
			protected override void Dispose(bool disposing)
			{
				if (disposing && !_disposed)
				{
					_disposed = true;
					RemoveAllViews();
					if (_renderer != null)
					{
						_renderer.Dispose();
						_renderer = null;
						_modal.ClearValue(Android.Platform.RendererProperty);
						_modal = null;
					}

					if (_backgroundView != null)
					{
						_backgroundView.Dispose();
						_backgroundView = null;
					}
				}

				base.Dispose(disposing);
			}
		/// <summary>
		/// Reflection from function Xamarin.Forms.Platform.iOS.Platform.SetRenderer ( BindableObject bindable , IVisualElementRenderer value )
		/// </summary>
		/// <param name="bindable">The bindable.</param>
		/// <param name="value">The value.</param>
		private static void SetRenderer ( BindableObject bindable , IVisualElementRenderer value ) {
			if ( bindable == null ) {
				return;
			}
			if ( value == null ) {
				return;
			}
			if ( setRendererDelegate == null ) {
				var assembly = typeof ( CarouselPageRenderer ).Assembly;
				var platformType = assembly.GetType ( "Xamarin.Forms.Platform.iOS.Platform" );
				var method = platformType.GetMethod ( "SetRenderer" );
				setRendererDelegate = ( SetRendererDelegate ) method.CreateDelegate ( typeof ( SetRendererDelegate ) );
			}
			setRendererDelegate ( bindable , value );
		}
コード例 #45
0
        void AddMenu()
        {
            if (_basePage == null)
                return;
            var menu = _basePage.SlideMenu;
            if (menu == null)
                return;

            _basePage.HideMenuAction = () => {
                if (_dragGesture == null)
                    return;
                var rect = _dragGesture.GetHidePosition ();
                _popMenuOverlayRenderer.ViewGroup.Animate ()
                    .X ((float)rect.left)
                    .Y ((float)rect.top)
                    .SetDuration (menu.AnimationDurationMillisecond)
                    .SetListener (new AnimatorListener (_dragGesture, false))
                    .Start ();
            };

            _basePage.ShowMenuAction = () => {
                if (_dragGesture == null)
                    return;
                var rect = _dragGesture.GetShowPosition ();
                _popMenuOverlayRenderer.ViewGroup.Animate ()
                    .X ((float)rect.left)
                    .Y ((float)rect.top)
                    .SetDuration (menu.AnimationDurationMillisecond)
                    .SetListener (new AnimatorListener (_dragGesture, true))
                    .Start ();
            };

            if (_popMenuOverlayRenderer == null) {
                _popMenuOverlayRenderer = RendererFactory.GetRenderer (menu);
                var metrics = _pageRenderer.Resources.DisplayMetrics;
                var rootView = _popMenuOverlayRenderer.ViewGroup;
                if (_popMenuOverlayRenderer is SlideMenuDroidRenderer) {
                    _dragGesture = (_popMenuOverlayRenderer as SlideMenuDroidRenderer).GragGesture;
                }
                if (_dragGesture == null)
                    return;
                var rect = _dragGesture.GetHidePosition ();

                menu.Layout (new Xamarin.Forms.Rectangle (
                    rect.left / metrics.Density,
                    rect.top / metrics.Density,
                    (rect.right - rect.left) / metrics.Density,
                    (rect.bottom - rect.top) / metrics.Density));

                _popMenuOverlayRenderer.UpdateLayout ();
                _popMenuOverlayRenderer.ViewGroup.Visibility = ViewStates.Visible;
                rootView.Layout ((int)rect.left, (int)rect.top, (int)rect.right, (int)rect.bottom);
                _pageRenderer.ViewGroup.AddView (rootView);
                _pageRenderer.ViewGroup.BringChildToFront (rootView);

                _dragGesture.NeedShowBackgroundView = (open, alpha) => {
                    if (open)
                        ShowBackgroundOverlay (alpha);
                    else
                        HideBackgroundOverlay ();
                };
            }
        }
コード例 #46
0
			public void Update(ViewCell cell)
			{
				Performance.Start();

				var renderer = GetChildAt(0) as IVisualElementRenderer;
				var viewHandlerType = Registrar.Registered.GetHandlerType(cell.View.GetType()) ?? typeof(Platform.DefaultRenderer);
				if (renderer != null && renderer.GetType() == 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.ViewGroup);
				Platform.SetRenderer(_viewCell.View, null);
				_viewCell.View.IsPlatformEnabled = false;
				_view.ViewGroup.Dispose();

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

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

				UpdateIsEnabled();

				Performance.Stop();
			}
コード例 #47
0
 public AutomationPropertiesProvider(IVisualElementRenderer renderer)
 {
     _renderer = renderer;
     _renderer.ElementPropertyChanged += OnElementPropertyChanged;
     _renderer.ElementChanged         += OnElementChanged;
 }
コード例 #48
0
 public PopupPlatformRenderer(IVisualElementRenderer renderer)
 {
     _renderer = renderer;
 }
コード例 #49
0
 public static void SetRenderer(BindableObject bindable, IVisualElementRenderer value)
 {
     bindable.SetValue(Platform.RendererProperty, value);
 }
コード例 #50
0
        protected override void OnLayout(bool changed, int l, int t, int r, int b)
        {
            FormsViewPager pager   = _viewPager;
            Context        context = Context;

            var width  = r - l;
            var height = b - t;

            if (IsBottomTabPlacement)
            {
                if (width <= 0 || height <= 0)
                {
                    return;
                }

                _relativeLayout.Measure(
                    MeasureSpec.MakeMeasureSpec(width, MeasureSpecMode.Exactly),
                    MeasureSpec.MakeMeasureSpec(height, MeasureSpecMode.Exactly));

                pager.Measure(MeasureSpecFactory.MakeMeasureSpec(width, MeasureSpecMode.AtMost), MeasureSpecFactory.MakeMeasureSpec(height, MeasureSpecMode.AtMost));

                if (width > 0 && height > 0)
                {
                    PageController.ContainerArea = new Rectangle(0, 0, context.FromPixels(width), context.FromPixels(height - _bottomNavigationView.Height));

                    pager.Layout(0, 0, width, b);
                    // We need to measure again to ensure that the tabs show up
                    _relativeLayout.Measure(
                        MeasureSpec.MakeMeasureSpec(width, MeasureSpecMode.Exactly),
                        MeasureSpec.MakeMeasureSpec(height, MeasureSpecMode.Exactly));
                    _relativeLayout.Layout(0, 0, _relativeLayout.MeasuredWidth, _relativeLayout.MeasuredHeight);
                }
            }
            else
            {
                TabLayout tabs = _tabLayout;

                tabs.Measure(MeasureSpecFactory.MakeMeasureSpec(width, MeasureSpecMode.Exactly), MeasureSpecFactory.MakeMeasureSpec(height, MeasureSpecMode.AtMost));
                var tabsHeight = 0;

                if (tabs.Visibility != ViewStates.Gone)
                {
                    //MinimumHeight is only available on API 16+
                    if ((int)Build.VERSION.SdkInt >= 16)
                    {
                        tabsHeight = Math.Min(height, Math.Max(tabs.MeasuredHeight, tabs.MinimumHeight));
                    }
                    else
                    {
                        tabsHeight = Math.Min(height, tabs.MeasuredHeight);
                    }
                }

                pager.Measure(MeasureSpecFactory.MakeMeasureSpec(width, MeasureSpecMode.AtMost), MeasureSpecFactory.MakeMeasureSpec(height, MeasureSpecMode.AtMost));

                if (width > 0 && height > 0)
                {
                    PageController.ContainerArea = new Rectangle(0, context.FromPixels(tabsHeight), context.FromPixels(width), context.FromPixels(height - tabsHeight));

                    for (var i = 0; i < PageController.InternalChildren.Count; i++)
                    {
                        var child = PageController.InternalChildren[i] as VisualElement;
                        if (child == null)
                        {
                            continue;
                        }
                        IVisualElementRenderer renderer = Android.Platform.GetRenderer(child);
                        var navigationRenderer          = renderer as NavigationPageRenderer;
                        if (navigationRenderer != null)
                        {
                            navigationRenderer.ContainerPadding = tabsHeight;
                        }
                    }

                    pager.Layout(0, 0, width, b);
                    // We need to measure again to ensure that the tabs show up
                    tabs.Measure(MeasureSpecFactory.MakeMeasureSpec(width, MeasureSpecMode.Exactly), MeasureSpecFactory.MakeMeasureSpec(tabsHeight, MeasureSpecMode.Exactly));
                    tabs.Layout(0, 0, width, tabsHeight);

                    UpdateTabBarTranslation(pager.CurrentItem, 0);
                }
            }

            base.OnLayout(changed, l, t, r, b);
        }
コード例 #51
0
 public static void SetRenderer(this VisualElement self, IVisualElementRenderer renderer)
 {
     Platform.SetRenderer(self, renderer);
 }
コード例 #52
0
		protected override void Dispose(bool disposing)
		{
			if (disposing)
				_modal = null;
			base.Dispose(disposing);
		}
コード例 #53
0
 public VisualElementTracker(IVisualElementRenderer renderer) : this(renderer, true)
 {
 }