diff --git a/Perspex.Layout/Layoutable.cs b/Perspex.Layout/Layoutable.cs
index 42bcb31d72..4a37c9a190 100644
--- a/Perspex.Layout/Layoutable.cs
+++ b/Perspex.Layout/Layoutable.cs
@@ -198,9 +198,11 @@ namespace Perspex.Layout
throw new InvalidOperationException("Invalid Arrange rectangle.");
}
- if (!this.DesiredSize.HasValue)
+ // If the measure was invalidated during an arrange pass, wait for the arrange pass to
+ // be re-run.
+ if (!this.IsMeasureValid)
{
- throw new InvalidOperationException("Arrange called before Measure.");
+ return;
}
if (force || !this.IsArrangeValid || this.previousArrange != rect)
@@ -233,6 +235,7 @@ namespace Perspex.Layout
this.IsArrangeValid = false;
this.previousMeasure = null;
this.previousArrange = null;
+ this.DesiredSize = null;
if (parent != null && IsResizable(parent))
{
diff --git a/Tests/Perspex.Layout.UnitTests/FullLayoutTests.cs b/Tests/Perspex.Layout.UnitTests/FullLayoutTests.cs
index 5acaa67c9c..8fd882c452 100644
--- a/Tests/Perspex.Layout.UnitTests/FullLayoutTests.cs
+++ b/Tests/Perspex.Layout.UnitTests/FullLayoutTests.cs
@@ -6,12 +6,15 @@
namespace Perspex.Layout.UnitTests
{
+ using System.Diagnostics;
+ using System.IO;
using System.Linq;
using Moq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
+ using Perspex.Diagnostics;
using Perspex.Input;
using Perspex.Platform;
using Perspex.Rendering;
@@ -62,6 +65,30 @@ namespace Perspex.Layout.UnitTests
}
}
+ class TestLogger : ILogger
+ {
+
+ StreamWriter s;
+
+ public TestLogger()
+ {
+ s = new StreamWriter(new FileStream(@"D:\temp\layout.txt", FileMode.Create, FileAccess.ReadWrite));
+ }
+
+ public LogLevel Level
+ {
+ get;
+ set;
+ }
+
+ public void Write(string message, LogLevel logLevel)
+ {
+ if ((int)logLevel < (int)Level) return;
+ s.WriteLine(message);
+ s.Flush();
+ }
+ }
+
[Fact]
public void Test_ScrollViewer_With_TextBlock()
{
@@ -69,6 +96,9 @@ namespace Perspex.Layout.UnitTests
{
this.RegisterServices();
+ LogManager.Enable(new TestLogger());
+ LogManager.Instance.LogLayoutMessages = true;
+
ScrollViewer scrollViewer;
TextBlock textBlock;
diff --git a/Tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj b/Tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj
index 418967507e..b896fcc253 100644
--- a/Tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj
+++ b/Tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj
@@ -67,6 +67,10 @@
+
+ {415e048e-4611-4815-9cf2-d774e29079ac}
+ NGenerics
+
{d211e587-d8bc-45b9-95a4-f297c8fa5200}
Perspex.Animation
@@ -79,6 +83,10 @@
{d2221c82-4a25-4583-9b43-d791e3f6820c}
Perspex.Controls
+
+ {7062ae20-5dcc-4442-9645-8195bdece63e}
+ Perspex.Diagnostics
+
{62024b2d-53eb-4638-b26b-85eeaa54866e}
Perspex.Input