diff --git a/Perspex.Diagnostics/LogManager.cs b/Perspex.Diagnostics/LogManager.cs
new file mode 100644
index 0000000000..61dcd3eef3
--- /dev/null
+++ b/Perspex.Diagnostics/LogManager.cs
@@ -0,0 +1,67 @@
+// -----------------------------------------------------------------------
+//
+// Copyright 2014 MIT Licence. See licence.md for more information.
+//
+// -----------------------------------------------------------------------
+
+namespace Perspex.Diagnostics
+{
+ using System;
+ using Perspex.Layout;
+ using Splat;
+
+ public class LogManager : ILogManager
+ {
+ private static LogManager instance;
+
+ public static LogManager Instance
+ {
+ get
+ {
+ if (instance == null)
+ {
+ instance = new LogManager();
+ }
+
+ return instance;
+ }
+ }
+
+ public ILogger Logger
+ {
+ get;
+ set;
+ }
+
+ public bool LogPropertyMessages
+ {
+ get;
+ set;
+ }
+
+ public bool LogLayoutMessages
+ {
+ get;
+ set;
+ }
+
+ public static void Enable(ILogger logger)
+ {
+ Instance.Logger = logger;
+ Locator.CurrentMutable.Register(() => Instance, typeof(ILogManager));
+ }
+
+ public IFullLogger GetLogger(Type type)
+ {
+ if ((type == typeof(PerspexObject) && LogPropertyMessages) ||
+ (type == typeof(Layoutable) && LogLayoutMessages))
+ {
+ return new WrappingFullLogger(this.Logger, type);
+ }
+ else
+ {
+ return new WrappingFullLogger(new NullLogger(), type);
+ }
+ }
+ }
+}
diff --git a/Perspex.Diagnostics/Perspex.Diagnostics.csproj b/Perspex.Diagnostics/Perspex.Diagnostics.csproj
index b42aa091ab..ecf90a5d76 100644
--- a/Perspex.Diagnostics/Perspex.Diagnostics.csproj
+++ b/Perspex.Diagnostics/Perspex.Diagnostics.csproj
@@ -21,7 +21,7 @@
full
false
bin\Debug\
- DEBUG;TRACE
+ TRACE;DEBUG
prompt
4
@@ -65,11 +65,15 @@
+
+
+ ..\packages\Splat.1.3.3\lib\Portable-net45+win+wpa81+wp80\Splat.dll
+
..\packages\Rx-Core.2.1.30214.0\lib\Portable-Net45+WinRT45+WP8\System.Reactive.Core.dll
diff --git a/Perspex.Diagnostics/packages.config b/Perspex.Diagnostics/packages.config
index 62f970e8dd..6567db553e 100644
--- a/Perspex.Diagnostics/packages.config
+++ b/Perspex.Diagnostics/packages.config
@@ -5,4 +5,5 @@
+
\ No newline at end of file
diff --git a/Perspex.Layout/ILayoutManager.cs b/Perspex.Layout/ILayoutManager.cs
index 04af09578b..0e8a84e92b 100644
--- a/Perspex.Layout/ILayoutManager.cs
+++ b/Perspex.Layout/ILayoutManager.cs
@@ -13,6 +13,8 @@ namespace Perspex.Layout
{
IObservable LayoutNeeded { get; }
+ bool LayoutQueued { get; }
+
void ExecuteLayoutPass();
void InvalidateMeasure(ILayoutable item);
diff --git a/Perspex.Layout/LayoutManager.cs b/Perspex.Layout/LayoutManager.cs
index 478e07f94e..8c25c127d2 100644
--- a/Perspex.Layout/LayoutManager.cs
+++ b/Perspex.Layout/LayoutManager.cs
@@ -7,7 +7,6 @@
namespace Perspex.Layout
{
using System;
- using System.Linq;
using System.Reactive;
using System.Reactive.Subjects;
@@ -30,25 +29,42 @@ namespace Perspex.Layout
get { return this.layoutNeeded; }
}
+ public bool LayoutQueued
+ {
+ get;
+ private set;
+ }
+
public void ExecuteLayoutPass()
{
- if (this.root != null)
- {
- this.root.Measure(this.root.ClientSize);
- this.root.Arrange(new Rect(this.root.ClientSize));
- }
+ this.root.Measure(this.root.ClientSize);
+ this.root.Arrange(new Rect(this.root.ClientSize));
+ this.LayoutQueued = false;
}
public void InvalidateMeasure(ILayoutable item)
{
- IVisual visual = item as IVisual;
- this.layoutNeeded.OnNext(Unit.Default);
+ if (!this.LayoutQueued)
+ {
+ IVisual visual = item as IVisual;
+ this.layoutNeeded.OnNext(Unit.Default);
+ this.LayoutQueued = true;
+ }
}
public void InvalidateArrange(ILayoutable item)
{
- IVisual visual = item as IVisual;
- this.layoutNeeded.OnNext(Unit.Default);
+ if (!this.LayoutQueued)
+ {
+ IVisual visual = item as IVisual;
+ this.layoutNeeded.OnNext(Unit.Default);
+ this.LayoutQueued = true;
+ }
+ }
+
+ public void LayoutFinished()
+ {
+ this.LayoutQueued = false;
}
}
}
diff --git a/Perspex.Windows/Window.cs b/Perspex.Windows/Window.cs
index b414e4bff7..b583691fba 100644
--- a/Perspex.Windows/Window.cs
+++ b/Perspex.Windows/Window.cs
@@ -59,14 +59,18 @@ namespace Perspex.Windows
});
this.RenderManager.RenderNeeded
+ .Where(_ => !this.LayoutManager.LayoutQueued)
.Subscribe(x =>
{
WindowsDispatcher.CurrentDispatcher.BeginInvoke(
DispatcherPriority.Render,
() =>
{
- this.renderer.Render(this);
- this.RenderManager.RenderFinished();
+ if (!this.LayoutManager.LayoutQueued)
+ {
+ this.renderer.Render(this);
+ this.RenderManager.RenderFinished();
+ }
});
});
}
diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs
index d738dff190..d2405ce871 100644
--- a/TestApplication/Program.cs
+++ b/TestApplication/Program.cs
@@ -1,12 +1,8 @@
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using Perspex;
+using Perspex;
using Perspex.Controls;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Media.Imaging;
-using Perspex.Threading;
using Perspex.Windows;
using Splat;
@@ -86,7 +82,8 @@ namespace TestApplication
static void Main(string[] args)
{
- //Locator.CurrentMutable.Register(() => new TestLogger { Level = LogLevel.Debug } , typeof(ILogger));
+ //LogManager.Enable(new TestLogger());
+ //LogManager.Instance.LogLayoutMessages = true;
App application = new App
{