summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core/ContentPresenter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core/ContentPresenter.cs')
-rw-r--r--Xamarin.Forms.Core/ContentPresenter.cs91
1 files changed, 91 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/ContentPresenter.cs b/Xamarin.Forms.Core/ContentPresenter.cs
new file mode 100644
index 00000000..a99a048b
--- /dev/null
+++ b/Xamarin.Forms.Core/ContentPresenter.cs
@@ -0,0 +1,91 @@
+using System;
+
+namespace Xamarin.Forms
+{
+ public class ContentPresenter : Layout
+ {
+ public static BindableProperty ContentProperty = BindableProperty.Create("Content", typeof(View), typeof(ContentPresenter), null, propertyChanged: OnContentChanged);
+
+ public ContentPresenter()
+ {
+ SetBinding(ContentProperty, new TemplateBinding("Content"));
+ }
+
+ public View Content
+ {
+ get { return (View)GetValue(ContentProperty); }
+ set { SetValue(ContentProperty, value); }
+ }
+
+ protected override void LayoutChildren(double x, double y, double width, double height)
+ {
+ for (var i = 0; i < LogicalChildren.Count; i++)
+ {
+ Element element = LogicalChildren[i];
+ var child = element as View;
+ if (child != null)
+ LayoutChildIntoBoundingRegion(child, new Rectangle(x, y, width, height));
+ }
+ }
+
+ [Obsolete("Use OnMeasure")]
+ protected override SizeRequest OnSizeRequest(double widthConstraint, double heightConstraint)
+ {
+ double widthRequest = WidthRequest;
+ double heightRequest = HeightRequest;
+ var childRequest = new SizeRequest();
+ if ((widthRequest == -1 || heightRequest == -1) && Content != null)
+ {
+ childRequest = Content.Measure(widthConstraint, heightConstraint, MeasureFlags.IncludeMargins);
+ }
+
+ return new SizeRequest
+ {
+ Request = new Size { Width = widthRequest != -1 ? widthRequest : childRequest.Request.Width, Height = heightRequest != -1 ? heightRequest : childRequest.Request.Height },
+ Minimum = childRequest.Minimum
+ };
+ }
+
+ internal virtual void Clear()
+ {
+ Content = null;
+ }
+
+ internal override void ComputeConstraintForView(View view)
+ {
+ bool isFixedHorizontally = (Constraint & LayoutConstraint.HorizontallyFixed) != 0;
+ bool isFixedVertically = (Constraint & LayoutConstraint.VerticallyFixed) != 0;
+
+ var result = LayoutConstraint.None;
+ if (isFixedVertically && view.VerticalOptions.Alignment == LayoutAlignment.Fill)
+ result |= LayoutConstraint.VerticallyFixed;
+ if (isFixedHorizontally && view.HorizontalOptions.Alignment == LayoutAlignment.Fill)
+ result |= LayoutConstraint.HorizontallyFixed;
+ view.ComputedConstraint = result;
+ }
+
+ internal override void SetChildInheritedBindingContext(Element child, object context)
+ {
+ // We never want to use the standard inheritance mechanism, we will get this set by our parent
+ }
+
+ static async void OnContentChanged(BindableObject bindable, object oldValue, object newValue)
+ {
+ var self = (ContentPresenter)bindable;
+
+ var oldView = (View)oldValue;
+ var newView = (View)newValue;
+ if (oldView != null)
+ {
+ self.InternalChildren.Remove(oldView);
+ oldView.ParentOverride = null;
+ }
+
+ if (newView != null)
+ {
+ self.InternalChildren.Add(newView);
+ newView.ParentOverride = await TemplateUtilities.FindTemplatedParentAsync((Element)bindable);
+ }
+ }
+ }
+} \ No newline at end of file