summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs')
-rw-r--r--Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs61
1 files changed, 61 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs b/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs
new file mode 100644
index 00000000..933f436f
--- /dev/null
+++ b/Xamarin.Forms.Platform.Android/NativeViewWrapperRenderer.cs
@@ -0,0 +1,61 @@
+namespace Xamarin.Forms.Platform.Android
+{
+ public class NativeViewWrapperRenderer : ViewRenderer<NativeViewWrapper, global::Android.Views.View>
+ {
+ public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint)
+ {
+ if (Element?.GetDesiredSizeDelegate == null)
+ return base.GetDesiredSize(widthConstraint, heightConstraint);
+
+ // The user has specified a different implementation of GetDesiredSizeDelegate
+ SizeRequest? result = Element.GetDesiredSizeDelegate(this, widthConstraint, heightConstraint);
+
+ // If the delegate returns a SizeRequest, we use it; if it returns null,
+ // fall back to the default implementation
+ return result ?? base.GetDesiredSize(widthConstraint, heightConstraint);
+ }
+
+ protected override void OnElementChanged(ElementChangedEventArgs<NativeViewWrapper> e)
+ {
+ base.OnElementChanged(e);
+
+ if (e.OldElement == null)
+ {
+ SetNativeControl(Element.NativeView);
+ Control.LayoutChange += (sender, args) => Element?.InvalidateMeasure(InvalidationTrigger.MeasureChanged);
+ }
+ }
+
+ protected override void OnLayout(bool changed, int l, int t, int r, int b)
+ {
+ if (Element?.OnLayoutDelegate == null)
+ {
+ base.OnLayout(changed, l, t, r, b);
+ return;
+ }
+
+ // The user has specified a different implementation of OnLayout
+ bool handled = Element.OnLayoutDelegate(this, changed, l, t, r, b);
+
+ // If the delegate wasn't able to handle the request, fall back to the default implementation
+ if (!handled)
+ base.OnLayout(changed, l, t, r, b);
+ }
+
+ protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ if (Element?.OnMeasureDelegate == null)
+ {
+ base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
+ return;
+ }
+
+ // The user has specified a different implementation of OnMeasure
+ bool handled = Element.OnMeasureDelegate(this, widthMeasureSpec, heightMeasureSpec);
+
+ // If the delegate wasn't able to handle the request, fall back to the default implementation
+ if (!handled)
+ base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+ }
+} \ No newline at end of file