maui-linux/Xamarin.Forms.Core/TemplatedView.cs

68 строки
2.4 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 < 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) && 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);
}
}
}