コード例 #1
0
        protected virtual void OnChildAdded(VisualElement view)
        {
            if (_isDisposed)
            {
                return;
            }
            var reference = Guid.NewGuid().ToString();

            Performance.Start(reference);
            if (CompressedLayout.GetIsHeadless(view))
            {
                var packager = new VisualElementPackager(Renderer, view);
                view.IsPlatformEnabled = true;
                packager.Load();
            }
            else
            {
                var viewRenderer = Platform.CreateRenderer(view);
                Platform.SetRenderer(view, viewRenderer);

                var uiview = Renderer.NativeView;
                uiview.AddSubview(viewRenderer.NativeView);

                if (Renderer.ViewController != null && viewRenderer.ViewController != null)
                {
                    Renderer.ViewController.AddChildViewController(viewRenderer.ViewController);
                }

                EnsureChildrenOrder();
            }
            Performance.Stop(reference);
        }
        void AddChild(VisualElement view, IVisualElementRenderer oldRenderer = null, RendererPool pool = null, bool sameChildren = false)
        {
            var reference = Guid.NewGuid().ToString();

            Performance.Start(reference);

            if (CompressedLayout.GetIsHeadless(view))
            {
                var packager = new VisualElementPackager(_renderer, view);
                if (_childPackagers == null)
                {
                    _childPackagers = new Dictionary <BindableObject, VisualElementPackager>();
                }
                view.IsPlatformEnabled = true;
                packager.Load();

                _childPackagers[view] = packager;
            }
            else
            {
                if (_childViews == null)
                {
                    _childViews = new List <IVisualElementRenderer>();
                }

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

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

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

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

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

            if (CompressedLayout.GetIsHeadless(view))
            {
                var packager = new VisualElementPackager(_renderer, view);
                view.IsPlatformEnabled = true;
                packager.Load();
            }
            else
            {
                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.View as ViewGroup)?.AddView(renderer.View);
                    _childViews.Add(renderer);
                }
                Performance.Stop("Add view");
            }
            Performance.Stop();
        }
コード例 #4
0
        static double ComputeAbsoluteY(VisualElement e)
        {
            var parentY = 0.0;

            if (e.RealParent is VisualElement ve)
            {
                if (CompressedLayout.GetIsHeadless(e.RealParent))
                {
                    parentY = ComputeAbsoluteY(ve);
                }
                else
                {
                    parentY = Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).GetNativeContentGeometry().Y);
                }
            }
            return(e.Y + parentY);
        }
コード例 #5
0
        static void UpdateLayout(IEnumerable <Element> children)
        {
            foreach (Element element in children)
            {
                var visualElement = element as VisualElement;
                if (visualElement == null)
                {
                    continue;
                }

                IVisualElementRenderer renderer = AppCompat.Platform.GetRenderer(visualElement);
                if (renderer == null && CompressedLayout.GetIsHeadless(visualElement))
                {
                    UpdateLayout(visualElement.LogicalChildren);
                }

                renderer?.UpdateLayout();
            }
        }
コード例 #6
0
ファイル: VisualElementRenderer.cs プロジェクト: sung-su/maui
 protected virtual void AddHeadlessChild(VisualElement element, IContainable <EvasObject> parent)
 {
     foreach (var child in (element as IVisualTreeElement).GetVisualChildren())
     {
         if (child is VisualElement visualChild)
         {
             if (CompressedLayout.GetIsHeadless(visualChild))
             {
                 AddHeadlessChild(visualChild, parent);
                 visualChild.IsPlatformEnabled = true;
             }
             else
             {
                 var childRenderer = Platform.GetOrCreateRenderer(visualChild);
                 parent.Children.Add(childRenderer.NativeView);
             }
         }
     }
 }
コード例 #7
0
ファイル: VisualElementRenderer.cs プロジェクト: sung-su/maui
 /// <summary>
 /// Adds a new child if it's derived from the VisualElement class. Otherwise this method does nothing.
 /// </summary>
 /// <param name="child">Child to be added.</param>
 protected virtual void AddChild(Element child)
 {
     if (child is VisualElement ve)
     {
         if (CompressedLayout.GetIsHeadless(ve) && NativeView is IContainable <EvasObject> containerNativeView)
         {
             AddHeadlessChild(ve, containerNativeView);
             ve.IsPlatformEnabled = true;
         }
         else
         {
             var childRenderer = Platform.GetOrCreateRenderer(ve);
             // if the native view can have children, attach the new child
             if (NativeView is IContainable <EvasObject> containerView)
             {
                 containerView.Children.Add(childRenderer.NativeView);
             }
         }
     }
 }
コード例 #8
0
 void FillChildrenWithRenderers(VisualElement element)
 {
     foreach (var logicalChild in ((IElementController)element).LogicalChildren)
     {
         var child = logicalChild as VisualElement;
         if (child != null)
         {
             if (CompressedLayout.GetIsHeadless(child))
             {
                 child.IsPlatformEnabled = true;
                 FillChildrenWithRenderers(child);
             }
             else
             {
                 var renderer = GetFreeRenderer(child) ?? Platform.CreateRenderer(child);
                 Platform.SetRenderer(child, renderer);
                 _parent.NativeView.AddSubview(renderer.NativeView);
             }
         }
     }
 }
コード例 #9
0
ファイル: VisualElementRenderer.cs プロジェクト: sung-su/maui
        static double ComputeAbsoluteY(VisualElement e)
        {
            var parentY = 0.0;

            if (e.RealParent is VisualElement parent)
            {
                if (CompressedLayout.GetIsHeadless(e.RealParent))
                {
                    parentY = ComputeAbsoluteY(parent);
                }
                else
                {
                    if (parent.Handler is IPlatformViewHandler nativeHandler)
                    {
                        parentY = nativeHandler.GetPlatformContentGeometry().Y.ToScaledDP();
                    }
                    else
                    {
                        parentY = Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).GetNativeContentGeometry().Y);
                    }
                }
            }
            return(e.Y + parentY);
        }