77 строки
2.7 KiB
C#
77 строки
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Xamarin.Forms
|
|
{
|
|
public class TemplatedView : Layout, IControlTemplated
|
|
{
|
|
public static readonly BindableProperty ControlTemplateProperty = BindableProperty.Create(nameof(ControlTemplate), typeof(ControlTemplate), typeof(TemplatedView), null,
|
|
propertyChanged: TemplateUtilities.OnControlTemplateChanged);
|
|
|
|
public ControlTemplate ControlTemplate
|
|
{
|
|
get { return (ControlTemplate)GetValue(ControlTemplateProperty); }
|
|
set { SetValue(ControlTemplateProperty, value); }
|
|
}
|
|
|
|
IList<Element> IControlTemplated.InternalChildren => InternalChildren;
|
|
|
|
protected override void LayoutChildren(double x, double y, double width, double height)
|
|
{
|
|
for (var i = 0; i < LogicalChildrenInternal.Count; i++)
|
|
{
|
|
Element element = LogicalChildrenInternal[i];
|
|
var child = element as View;
|
|
if (child != null)
|
|
LayoutChildIntoBoundingRegion(child, new Rectangle(x, y, width, height));
|
|
}
|
|
}
|
|
|
|
[Obsolete("OnSizeRequest is obsolete as of version 2.2.0. Please use OnMeasure instead.")]
|
|
protected override SizeRequest OnSizeRequest(double widthConstraint, double heightConstraint)
|
|
{
|
|
double widthRequest = WidthRequest;
|
|
double heightRequest = HeightRequest;
|
|
var childRequest = new SizeRequest();
|
|
|
|
if ((widthRequest == -1 || heightRequest == -1) && InternalChildren.Count > 0)
|
|
{
|
|
childRequest = ((View)InternalChildren[0]).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 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)
|
|
{
|
|
if (ControlTemplate == null)
|
|
base.SetChildInheritedBindingContext(child, context);
|
|
}
|
|
|
|
void IControlTemplated.OnControlTemplateChanged(ControlTemplate oldValue, ControlTemplate newValue)
|
|
{
|
|
OnControlTemplateChanged(oldValue, newValue);
|
|
}
|
|
|
|
internal virtual void OnControlTemplateChanged(ControlTemplate oldValue, ControlTemplate newValue)
|
|
{
|
|
}
|
|
}
|
|
} |