diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs index 69b3152e9b..326556f629 100644 --- a/src/Avalonia.Controls/Application.cs +++ b/src/Avalonia.Controls/Application.cs @@ -175,7 +175,6 @@ namespace Avalonia .Bind().ToTransient() .Bind().ToConstant(_styler) .Bind().ToSingleton() - .Bind().ToTransient() .Bind().ToConstant(this); } } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 606fcee1f3..43c59f0b31 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -96,8 +96,8 @@ namespace Avalonia.Controls _renderInterface = TryGetService(dependencyResolver); var renderLoop = TryGetService(dependencyResolver); - Renderer = TryGetService(dependencyResolver); - Renderer?.Attach(this, renderLoop); + var rendererFactory = TryGetService(dependencyResolver); + Renderer = rendererFactory?.CreateRenderer(this, renderLoop); PlatformImpl.SetInputRoot(this); PlatformImpl.Activated = HandleActivated; diff --git a/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj b/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj index 18f5c58c61..3d2347683d 100644 --- a/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj +++ b/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj @@ -103,6 +103,7 @@ + diff --git a/src/Avalonia.SceneGraph/Rendering/IRenderer.cs b/src/Avalonia.SceneGraph/Rendering/IRenderer.cs index 864dfd9ae3..c643662179 100644 --- a/src/Avalonia.SceneGraph/Rendering/IRenderer.cs +++ b/src/Avalonia.SceneGraph/Rendering/IRenderer.cs @@ -10,8 +10,6 @@ namespace Avalonia.Rendering { void AddDirty(IVisual visual); - void Attach(IRenderRoot root, IRenderLoop renderLoop); - void Render(Rect rect); } } \ No newline at end of file diff --git a/src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs b/src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs new file mode 100644 index 0000000000..8e27f85193 --- /dev/null +++ b/src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs @@ -0,0 +1,18 @@ +using System; + +namespace Avalonia.Rendering +{ + /// + /// Defines a factory for creating instances. + /// + public interface IRendererFactory + { + /// + /// Creates a new renderer for the specified render root. + /// + /// The render root. + /// The render loop. + /// An instance of an . + IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop); + } +} diff --git a/src/Avalonia.SceneGraph/Rendering/Renderer.cs b/src/Avalonia.SceneGraph/Rendering/Renderer.cs index 04baf0b505..ed58d129af 100644 --- a/src/Avalonia.SceneGraph/Rendering/Renderer.cs +++ b/src/Avalonia.SceneGraph/Rendering/Renderer.cs @@ -9,12 +9,12 @@ namespace Avalonia.Rendering { public class Renderer : IDisposable, IRenderer { - private IRenderLoop _renderLoop; - private IRenderRoot _root; + private readonly IRenderLoop _renderLoop; + private readonly IRenderRoot _root; private IRenderTarget _renderTarget; private bool _dirty; - public void Attach(IRenderRoot root, IRenderLoop renderLoop) + public Renderer(IRenderRoot root, IRenderLoop renderLoop) { Contract.Requires(root != null); diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index 73ecf78907..b43eef2fa9 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -7,6 +7,7 @@ using Avalonia.Direct2D1.Media; using Avalonia.Media; using Avalonia.Platform; using Avalonia.Controls; +using Avalonia.Rendering; namespace Avalonia { @@ -22,7 +23,7 @@ namespace Avalonia namespace Avalonia.Direct2D1 { - public class Direct2D1Platform : IPlatformRenderInterface + public class Direct2D1Platform : IPlatformRenderInterface, IRendererFactory { private static readonly Direct2D1Platform s_instance = new Direct2D1Platform(); @@ -38,6 +39,7 @@ namespace Avalonia.Direct2D1 public static void Initialize() => AvaloniaLocator.CurrentMutable .Bind().ToConstant(s_instance) + .Bind().ToConstant(s_instance) .BindToSelf(s_d2D1Factory) .BindToSelf(s_dwfactory) .BindToSelf(s_imagingFactory); @@ -59,6 +61,11 @@ namespace Avalonia.Direct2D1 return new FormattedTextImpl(text, fontFamily, fontSize, fontStyle, textAlignment, fontWeight, wrapping); } + public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) + { + return new Renderer(root, renderLoop); + } + public IRenderTarget CreateRenderTarget(IPlatformHandle handle) { if (handle.HandleDescriptor == "HWND")