diff --git a/Perspex.Windows/Window.cs b/Perspex.Windows/Window.cs index 527447bd56..efd5c5cfa6 100644 --- a/Perspex.Windows/Window.cs +++ b/Perspex.Windows/Window.cs @@ -16,16 +16,14 @@ namespace Perspex.Windows using Perspex.Input.Raw; using Perspex.Layout; using Perspex.Platform; + using Perspex.Rendering; using Perspex.Windows.Input; using Perspex.Windows.Interop; using Perspex.Windows.Threading; using Splat; - public class Window : ContentControl, ILayoutRoot + public class Window : ContentControl, ILayoutRoot, IRendered { - public static readonly PerspexProperty FontSizeProperty = - TextBlock.FontSizeProperty.AddOwner(); - private UnmanagedMethods.WndProc wndProcDelegate; private string className; @@ -46,6 +44,7 @@ namespace Perspex.Windows this.CreateWindow(); Size clientSize = this.ClientSize; this.LayoutManager = new LayoutManager(); + this.RenderManager = new RenderManager(); this.renderer = factory.CreateRenderer(this.Handle, (int)clientSize.Width, (int)clientSize.Height); this.inputManager = Locator.Current.GetService(); this.Template = ControlTemplate.Create(this.DefaultTemplate); @@ -60,6 +59,16 @@ namespace Perspex.Windows this.renderer.Render(this); }); }); + + this.RenderManager.RenderNeeded.Subscribe(x => + { + Dispatcher.CurrentDispatcher.BeginInvoke( + DispatcherPriority.Render, + () => + { + this.renderer.Render(this); + }); + }); } public Size ClientSize @@ -84,6 +93,12 @@ namespace Perspex.Windows private set; } + public IRenderManager RenderManager + { + get; + private set; + } + public void Show() { UnmanagedMethods.ShowWindow(this.Handle, 4); diff --git a/Perspex/Perspex.csproj b/Perspex/Perspex.csproj index 105439c240..934326132a 100644 --- a/Perspex/Perspex.csproj +++ b/Perspex/Perspex.csproj @@ -105,6 +105,9 @@ + + + diff --git a/Perspex/Rendering/IRenderManager.cs b/Perspex/Rendering/IRenderManager.cs new file mode 100644 index 0000000000..f239f7d7e5 --- /dev/null +++ b/Perspex/Rendering/IRenderManager.cs @@ -0,0 +1,18 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2013 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Rendering +{ + using System; + using System.Reactive; + + public interface IRenderManager + { + IObservable RenderNeeded { get; } + + void InvalidateRender(IVisual visual); + } +} diff --git a/Perspex/Rendering/IRendered.cs b/Perspex/Rendering/IRendered.cs new file mode 100644 index 0000000000..bfabbca2e3 --- /dev/null +++ b/Perspex/Rendering/IRendered.cs @@ -0,0 +1,13 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2013 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Rendering +{ + public interface IRendered + { + IRenderManager RenderManager { get; } + } +} diff --git a/Perspex/Rendering/RenderManager.cs b/Perspex/Rendering/RenderManager.cs new file mode 100644 index 0000000000..a5c0e9448c --- /dev/null +++ b/Perspex/Rendering/RenderManager.cs @@ -0,0 +1,27 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2013 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Rendering +{ + using System; + using System.Reactive; + using System.Reactive.Subjects; + + public class RenderManager : IRenderManager + { + private Subject renderNeeded = new Subject(); + + public IObservable RenderNeeded + { + get { return this.renderNeeded; } + } + + public void InvalidateRender(IVisual visual) + { + this.renderNeeded.OnNext(Unit.Default); + } + } +} diff --git a/Perspex/Visual.cs b/Perspex/Visual.cs index b63b38f402..96fb3a63de 100644 --- a/Perspex/Visual.cs +++ b/Perspex/Visual.cs @@ -12,6 +12,7 @@ namespace Perspex using Perspex.Controls; using Perspex.Layout; using Perspex.Media; + using Perspex.Rendering; using Splat; public enum Visibility @@ -83,12 +84,11 @@ namespace Perspex public void InvalidateVisual() { - ILayoutRoot root = this.GetVisualAncestorOrSelf(); + IRendered root = this.GetVisualAncestorOrSelf(); - if (root != null && root.LayoutManager != null) + if (root != null && root.RenderManager != null) { - // HACK HACK HACK! - root.LayoutManager.InvalidateArrange((ILayoutable)this); + root.RenderManager.InvalidateRender(this); } }