diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/GitHub2642.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/GitHub2642.cs
new file mode 100644
index 00000000000..aabb1aa6476
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/GitHub2642.cs
@@ -0,0 +1,51 @@
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Github, 2642, "ControlTemplate resizing issue", PlatformAffected.WPF)]
+ public class GitHub2642 : TestContentPage
+ {
+ public class PresenterWrapper : ContentView
+ {
+ public PresenterWrapper()
+ {
+ Content = new ContentPresenter();
+ }
+ }
+
+ protected override void Init()
+ {
+ this.ControlTemplate = new ControlTemplate(typeof(PresenterWrapper));
+
+ var grid = new Grid()
+ {
+ RowDefinitions = new RowDefinitionCollection
+ {
+ new RowDefinition { Height = new GridLength(0, GridUnitType.Auto) },
+ new RowDefinition { Height = new GridLength(1, GridUnitType.Star) },
+ }
+ };
+
+ grid.AddChild(new Label()
+ {
+ Text = "Header",
+ LineBreakMode = LineBreakMode.WordWrap,
+ FontSize = 24
+
+ }, 0, 0);
+
+ grid.AddChild(new Label()
+ {
+ Text = "Lorem ipsum dolor sit amet, sed at etiam graecis. Amet dicta utroque in ius, error vituperatoribus vel ex. " +
+ "Cu duo veri aperiam honestatis. Quo sint movet ullamcorper cu, vero vidisse argumentum ne nec, in munere eirmod eum. " +
+ "Persius similique reformidans ex mei, cu quo quot nihil mediocrem.",
+ LineBreakMode = LineBreakMode.WordWrap
+
+ }, 0, 1);
+
+ Content = grid;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
index 3eb4f8f3b81..dcb57e3d678 100644
--- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
@@ -263,6 +263,7 @@
+
diff --git a/Xamarin.Forms.Platform.WPF/FormsContentLoader.cs b/Xamarin.Forms.Platform.WPF/FormsContentLoader.cs
index 08a492aac1c..b8158261402 100644
--- a/Xamarin.Forms.Platform.WPF/FormsContentLoader.cs
+++ b/Xamarin.Forms.Platform.WPF/FormsContentLoader.cs
@@ -50,11 +50,25 @@ private object CreateOrResizeContent(FrameworkElement parent, VisualElement visu
//if (Debugger.IsAttached)
// Console.WriteLine("Page type : " + visualElement.GetType() + " (" + (visualElement as Page).Title + ") -- Parent type : " + visualElement.Parent.GetType() + " -- " + parent.ActualHeight + "H*" + parent.ActualWidth + "W");
- visualElement.Layout(new Rectangle(0, 0, parent.ActualWidth, parent.ActualHeight));
+ var actualRect = new Rectangle(0, 0, parent.ActualWidth, parent.ActualHeight);
+ visualElement.Layout(actualRect);
+
+ // ControlTemplate adds an additional layer through which to send sizing changes.
+ var contentPage = visualElement as ContentPage;
+ if (contentPage?.ControlTemplate != null)
+ {
+ contentPage.Content?.Layout(actualRect);
+ }
+ else
+ {
+ var contentView = visualElement as ContentView;
+ if (contentView?.ControlTemplate != null)
+ contentView.Content?.Layout(actualRect);
+ }
IPageController pageController = visualElement.RealParent as IPageController;
if (pageController != null)
- pageController.ContainerArea = new Rectangle(0, 0, parent.ActualWidth, parent.ActualHeight);
+ pageController.ContainerArea = actualRect;
return renderer.GetNativeElement();
}