소스 검색

Merge branch 'locator'

Nikita Tsukanov 10 년 전
부모
커밋
3e0f4059cd
100개의 변경된 파일304개의 추가작업 그리고 332개의 파일을 삭제
  1. 4 0
      samples/TestApplication/App.config
  2. 0 3
      samples/TestApplication/TestApplication.csproj
  3. 7 8
      samples/TestApplication/packages.config
  4. 4 3
      samples/XamlTestApplication/XamlTestApplication.csproj
  5. 1 1
      samples/XamlTestApplication/packages.config
  6. 1 6
      src/Gtk/Perspex.Cairo/CairoPlatform.cs
  7. 0 1
      src/Gtk/Perspex.Cairo/Media/FormattedTextImpl.cs
  8. 0 1
      src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs
  9. 0 3
      src/Gtk/Perspex.Cairo/Perspex.Cairo.csproj
  10. 3 4
      src/Gtk/Perspex.Cairo/packages.config
  11. 10 10
      src/Gtk/Perspex.Gtk/GtkPlatform.cs
  12. 0 3
      src/Gtk/Perspex.Gtk/Perspex.Gtk.csproj
  13. 3 4
      src/Gtk/Perspex.Gtk/packages.config
  14. 1 2
      src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs
  15. 0 3
      src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj
  16. 2 3
      src/Markup/Perspex.Markup.Xaml/PerspexXamlLoader.cs
  17. 0 1
      src/Markup/Perspex.Markup.Xaml/packages.config
  18. 11 11
      src/Perspex.Application/Application.cs
  19. 0 3
      src/Perspex.Application/Perspex.Application.csproj
  20. 0 1
      src/Perspex.Application/packages.config
  21. 1 3
      src/Perspex.Base/Perspex.Base.csproj
  22. 120 0
      src/Perspex.Base/PerspexLocator.cs
  23. 2 3
      src/Perspex.Base/Threading/DispatcherTimer.cs
  24. 1 2
      src/Perspex.Base/Threading/MainLoop.cs
  25. 0 1
      src/Perspex.Base/packages.config
  26. 1 2
      src/Perspex.Controls/Control.cs
  27. 3 15
      src/Perspex.Controls/MenuItem.cs
  28. 0 3
      src/Perspex.Controls/Perspex.Controls.csproj
  29. 1 2
      src/Perspex.Controls/Primitives/Popup.cs
  30. 2 3
      src/Perspex.Controls/Primitives/PopupRoot.cs
  31. 2 3
      src/Perspex.Controls/SystemDialog.cs
  32. 1 2
      src/Perspex.Controls/Templates/DataTemplateExtensions.cs
  33. 2 3
      src/Perspex.Controls/TextBox.cs
  34. 5 6
      src/Perspex.Controls/TopLevel.cs
  35. 1 2
      src/Perspex.Controls/Window.cs
  36. 0 1
      src/Perspex.Controls/packages.config
  37. 1 2
      src/Perspex.HtmlRenderer/Adapters/PerspexAdapter.cs
  38. 0 3
      src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj
  39. 0 1
      src/Perspex.HtmlRenderer/packages.config
  40. 1 2
      src/Perspex.Input/Cursors.cs
  41. 1 2
      src/Perspex.Input/FocusManager.cs
  42. 1 2
      src/Perspex.Input/InputManager.cs
  43. 3 4
      src/Perspex.Input/KeyboardDevice.cs
  44. 3 4
      src/Perspex.Input/MouseDevice.cs
  45. 0 3
      src/Perspex.Input/Perspex.Input.csproj
  46. 0 1
      src/Perspex.Input/packages.config
  47. 0 3
      src/Perspex.Interactivity/Perspex.Interactivity.csproj
  48. 0 1
      src/Perspex.Interactivity/packages.config
  49. 0 3
      src/Perspex.Layout/Perspex.Layout.csproj
  50. 0 1
      src/Perspex.Layout/packages.config
  51. 1 2
      src/Perspex.SceneGraph/Media/EllipseGeometry.cs
  52. 1 2
      src/Perspex.SceneGraph/Media/FormattedText.cs
  53. 3 4
      src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs
  54. 1 2
      src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs
  55. 1 2
      src/Perspex.SceneGraph/Media/RectangleGeometry.cs
  56. 1 2
      src/Perspex.SceneGraph/Media/StreamGeometry.cs
  57. 0 3
      src/Perspex.SceneGraph/Perspex.SceneGraph.csproj
  58. 0 1
      src/Perspex.SceneGraph/packages.config
  59. 0 3
      src/Perspex.Styling/Perspex.Styling.csproj
  60. 1 2
      src/Perspex.Styling/Styling/Styler.cs
  61. 0 3
      src/Perspex.Themes.Default/Perspex.Themes.Default.csproj
  62. 0 1
      src/Perspex.Themes.Default/packages.config
  63. 3 4
      src/Shared/PlatformSupport/SharedPlatform.cs
  64. 5 9
      src/Windows/Perspex.Direct2D1/Direct2D1Platform.cs
  65. 1 2
      src/Windows/Perspex.Direct2D1/Media/FormattedTextImpl.cs
  66. 1 2
      src/Windows/Perspex.Direct2D1/Media/GeometryImpl.cs
  67. 2 3
      src/Windows/Perspex.Direct2D1/Media/StreamGeometryImpl.cs
  68. 0 3
      src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj
  69. 4 5
      src/Windows/Perspex.Direct2D1/Renderer.cs
  70. 0 1
      src/Windows/Perspex.Direct2D1/packages.config
  71. 0 3
      src/Windows/Perspex.Win32/Perspex.Win32.csproj
  72. 12 14
      src/Windows/Perspex.Win32/Win32Platform.cs
  73. 0 1
      src/Windows/Perspex.Win32/packages.config
  74. 0 3
      tests/Perspex.Base.UnitTests/Perspex.Base.UnitTests.csproj
  75. 0 1
      tests/Perspex.Base.UnitTests/packages.config
  76. 4 4
      tests/Perspex.Controls.UnitTests/ContentControlTests.cs
  77. 4 5
      tests/Perspex.Controls.UnitTests/ControlTests.cs
  78. 3 3
      tests/Perspex.Controls.UnitTests/DropDownTests.cs
  79. 0 3
      tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj
  80. 9 7
      tests/Perspex.Controls.UnitTests/Primitives/PopupTests.cs
  81. 3 3
      tests/Perspex.Controls.UnitTests/TemplatedControlTests.cs
  82. 29 28
      tests/Perspex.Controls.UnitTests/TopLevelTests.cs
  83. 0 1
      tests/Perspex.Controls.UnitTests/packages.config
  84. 2 3
      tests/Perspex.Direct2D1.UnitTests/Controls/Shapes/PathTests.cs
  85. 2 3
      tests/Perspex.Direct2D1.UnitTests/Media/GeometryTests.cs
  86. 0 3
      tests/Perspex.Direct2D1.UnitTests/Perspex.Direct2D1.UnitTests.csproj
  87. 0 1
      tests/Perspex.Direct2D1.UnitTests/packages.config
  88. 0 3
      tests/Perspex.Input.UnitTests/Perspex.Input.UnitTests.csproj
  89. 0 1
      tests/Perspex.Input.UnitTests/packages.config
  90. 0 3
      tests/Perspex.Interactivity.UnitTests/Perspex.Interactivity.UnitTests.csproj
  91. 0 1
      tests/Perspex.Interactivity.UnitTests/packages.config
  92. 12 12
      tests/Perspex.Layout.UnitTests/FullLayoutTests.cs
  93. 0 3
      tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj
  94. 0 1
      tests/Perspex.Layout.UnitTests/packages.config
  95. 0 3
      tests/Perspex.RenderTests/Perspex.Cairo.RenderTests.csproj
  96. 0 1
      tests/Perspex.RenderTests/packages.config
  97. 0 3
      tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj
  98. 0 1
      tests/Perspex.SceneGraph.UnitTests/packages.config
  99. 0 3
      tests/Perspex.Styling.UnitTests/Perspex.Styling.UnitTests.csproj
  100. 0 1
      tests/Perspex.Styling.UnitTests/packages.config

+ 4 - 0
samples/TestApplication/App.config

@@ -21,6 +21,10 @@
         <assemblyIdentity name="SharpDX" publicKeyToken="b4dcf0f35e5521f1" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-2.6.3.0" newVersion="2.6.3.0" />
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="Mono.Cairo" publicKeyToken="0738eb9f132ed756" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
+      </dependentAssembly>
     </assemblyBinding>
   </runtime>
 </configuration>

+ 0 - 3
samples/TestApplication/TestApplication.csproj

@@ -66,9 +66,6 @@
     <Reference Include="Serilog.FullNetFx, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
       <HintPath>..\..\packages\Serilog.1.5.9\lib\net45\Serilog.FullNetFx.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="App.cs" />

+ 7 - 8
samples/TestApplication/packages.config

@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Rx-Core" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-Linq" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-Main" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-XAML" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Serilog" version="1.5.9" targetFramework="net45" userInstalled="true" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" userInstalled="true" />
+  <package id="Rx-Core" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Main" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-XAML" version="2.2.5" targetFramework="net45" />
+  <package id="Serilog" version="1.5.9" targetFramework="net45" />
 </packages>

+ 4 - 3
samples/XamlTestApplication/XamlTestApplication.csproj

@@ -36,6 +36,10 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Drawing" />
@@ -55,9 +59,6 @@
     <Reference Include="Serilog.FullNetFx, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
       <HintPath>..\..\packages\Serilog.1.5.9\lib\net45\Serilog.FullNetFx.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="Sprache, Version=2.0.0.47, Culture=neutral, PublicKeyToken=null">
       <HintPath>..\..\packages\Sprache.2.0.0.47\lib\portable-net4+netcore45+win8+wp8+sl5+MonoAndroid1+MonoTouch1\Sprache.dll</HintPath>
     </Reference>

+ 1 - 1
samples/XamlTestApplication/packages.config

@@ -7,6 +7,6 @@
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net46" />
   <package id="Rx-XAML" version="2.2.5" targetFramework="net46" />
   <package id="Serilog" version="1.5.9" targetFramework="net46" />
-  <package id="Splat" version="1.6.2" targetFramework="net46" />
+  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="Sprache" version="2.0.0.47" targetFramework="net451" />
 </packages>

+ 1 - 6
src/Gtk/Perspex.Cairo/CairoPlatform.cs

@@ -6,7 +6,6 @@ using Perspex.Cairo.Media;
 using Perspex.Cairo.Media.Imaging;
 using Perspex.Media;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Cairo
 {
@@ -19,11 +18,7 @@ namespace Perspex.Cairo
 
         private static Pango.Context s_pangoContext = CreatePangoContext();
 
-        public static void Initialize()
-        {
-            var locator = Locator.CurrentMutable;
-            locator.Register(() => s_instance, typeof(IPlatformRenderInterface));
-        }
+        public static void Initialize() => PerspexLocator.CurrentMutable.Bind<IPlatformRenderInterface>().ToConstant(s_instance);
 
         public IBitmapImpl CreateBitmap(int width, int height)
         {

+ 0 - 1
src/Gtk/Perspex.Cairo/Media/FormattedTextImpl.cs

@@ -7,7 +7,6 @@ using System.Linq;
 using System.Text;
 using Perspex.Media;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Cairo.Media
 {

+ 0 - 1
src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs

@@ -4,7 +4,6 @@
 using System;
 using Perspex.Media;
 using Perspex.Platform;
-using Splat;
 using System.Collections.Generic;
 
 namespace Perspex.Cairo.Media

+ 0 - 3
src/Gtk/Perspex.Cairo/Perspex.Cairo.csproj

@@ -51,9 +51,6 @@
       <HintPath>..\..\..\packages\Rx-Interfaces.2.2.5\lib\net45\System.Reactive.Interfaces.dll</HintPath>
     </Reference>
     <Reference Include="atk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="CairoPlatform.cs" />

+ 3 - 4
src/Gtk/Perspex.Cairo/packages.config

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Rx-Core" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" userInstalled="true" />
-</packages>
+  <package id="Rx-Core" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
+</packages>

+ 10 - 10
src/Gtk/Perspex.Gtk/GtkPlatform.cs

@@ -8,7 +8,6 @@ using Perspex.Input.Platform;
 using Perspex.Input;
 using Perspex.Platform;
 using Perspex.Shared.PlatformSupport;
-using Splat;
 
 namespace Perspex.Gtk
 {
@@ -29,15 +28,16 @@ namespace Perspex.Gtk
 
         public static void Initialize()
         {
-            var locator = Locator.CurrentMutable;
-            locator.Register(() => new WindowImpl(), typeof(IWindowImpl));
-            locator.Register(() => new PopupImpl(), typeof(IPopupImpl));
-            locator.Register(() => new ClipboardImpl(), typeof(IClipboard));
-            locator.Register(() => CursorFactory.Instance, typeof(IStandardCursorFactory));
-            locator.Register(() => GtkKeyboardDevice.Instance, typeof(IKeyboardDevice));
-            locator.Register(() => s_instance, typeof(IPlatformSettings));
-            locator.Register(() => s_instance, typeof(IPlatformThreadingInterface));
-            locator.Register(() => new SystemDialogImpl(), typeof (ISystemDialogImpl));
+            PerspexLocator.CurrentMutable
+                .Bind<IWindowImpl>().ToTransient<WindowImpl>()
+                .Bind<IPopupImpl>().ToTransient<PopupImpl>()
+                .Bind<IClipboard>().ToSingleton<ClipboardImpl>()
+                .Bind<IStandardCursorFactory>().ToConstant(CursorFactory.Instance)
+                .Bind<IKeyboardDevice>().ToConstant(GtkKeyboardDevice.Instance)
+                .Bind<IMouseDevice>().ToConstant(GtkMouseDevice.Instance)
+                .Bind<IPlatformSettings>().ToConstant(s_instance)
+                .Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
+                .Bind<ISystemDialogImpl>().ToSingleton<SystemDialogImpl>();
             SharedPlatform.Register();
         }
 

+ 0 - 3
src/Gtk/Perspex.Gtk/Perspex.Gtk.csproj

@@ -44,9 +44,6 @@
       <HintPath>..\..\..\packages\Rx-Linq.2.2.5\lib\net45\System.Reactive.Linq.dll</HintPath>
     </Reference>
     <Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="ClipboardImpl.cs" />

+ 3 - 4
src/Gtk/Perspex.Gtk/packages.config

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Rx-Core" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Rx-Linq" version="2.2.5" targetFramework="net45" userInstalled="true" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" userInstalled="true" />
+  <package id="Rx-Core" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
 </packages>

+ 1 - 2
src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs

@@ -20,7 +20,6 @@ using Perspex.Media.Imaging;
 using Perspex.Metadata;
 using Perspex.Platform;
 using Perspex.Styling;
-using Splat;
 
 namespace Perspex.Markup.Xaml.Context
 {
@@ -52,7 +51,7 @@ namespace Perspex.Markup.Xaml.Context
 
             foreach (var nsa in 
                 forcedAssemblies
-                    .Concat(Locator.Current.GetService<IPclPlatformWrapper>().GetLoadedAssemblies())
+                    .Concat(PerspexLocator.Current.GetService<IPclPlatformWrapper>().GetLoadedAssemblies())
                     .Distinct()
                     .SelectMany(asm
                         => asm.GetCustomAttributes<XmlnsDefinitionAttribute>().Select(attr => new {asm, attr}))

+ 0 - 3
src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj

@@ -291,9 +291,6 @@
     <Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
       <HintPath>..\..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="Sprache, Version=2.0.0.47, Culture=neutral, PublicKeyToken=null">
       <HintPath>..\..\..\packages\Sprache.2.0.0.47\lib\portable-net4+netcore45+win8+wp8+sl5+MonoAndroid1+MonoTouch1\Sprache.dll</HintPath>
     </Reference>

+ 2 - 3
src/Markup/Perspex.Markup.Xaml/PerspexXamlLoader.cs

@@ -8,7 +8,6 @@ using System.Reflection;
 using OmniXaml;
 using Perspex.Markup.Xaml.Context;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Markup.Xaml
 {
@@ -57,7 +56,7 @@ namespace Perspex.Markup.Xaml
             // HACK: Currently Visual Studio is forcing us to change the extension of xaml files
             // in certain situations, so we try to load .xaml and if that's not found we try .paml.
             // Ideally we'd be able to use .xaml everywhere
-            var assetLocator = Locator.Current.GetService<IAssetLoader>();
+            var assetLocator = PerspexLocator.Current.GetService<IAssetLoader>();
             if (assetLocator == null)
             {
                 throw new InvalidOperationException(
@@ -86,7 +85,7 @@ namespace Perspex.Markup.Xaml
         /// <returns>The loaded object.</returns>
         public object Load(Uri uri, object rootInstance = null)
         {
-            var assetLocator = Locator.Current.GetService<IAssetLoader>();
+            var assetLocator = PerspexLocator.Current.GetService<IAssetLoader>();
 
             if (assetLocator == null)
             {

+ 0 - 1
src/Markup/Perspex.Markup.Xaml/packages.config

@@ -6,6 +6,5 @@
   <package id="Rx-Main" version="2.2.5" targetFramework="portable46-net451+win81" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable46-net451+win81" />
   <package id="Serilog" version="1.5.9" targetFramework="portable46-net451+win81" />
-  <package id="Splat" version="1.6.2" targetFramework="portable46-net451+win81" />
   <package id="Sprache" version="2.0.0.47" targetFramework="portable45-net45+win8" />
 </packages>

+ 11 - 11
src/Perspex.Application/Application.cs

@@ -12,7 +12,6 @@ using Perspex.Layout;
 using Perspex.Rendering;
 using Perspex.Styling;
 using Perspex.Threading;
-using Splat;
 
 namespace Perspex
 {
@@ -40,7 +39,7 @@ namespace Perspex
         private DataTemplates _dataTemplates;
 
         private readonly Lazy<IClipboard> _clipboard =
-            new Lazy<IClipboard>(() => (IClipboard)Locator.Current.GetService(typeof(IClipboard)));
+            new Lazy<IClipboard>(() => (IClipboard)PerspexLocator.Current.GetService(typeof(IClipboard)));
 
         /// <summary>
         /// The styler that will be used to apply styles to controls.
@@ -157,15 +156,16 @@ namespace Perspex
             FocusManager = new FocusManager();
             InputManager = new InputManager();
 
-            Locator.CurrentMutable.Register(() => new AccessKeyHandler(), typeof(IAccessKeyHandler));
-            Locator.CurrentMutable.Register(() => this, typeof(IGlobalDataTemplates));
-            Locator.CurrentMutable.Register(() => this, typeof(IGlobalStyles));
-            Locator.CurrentMutable.Register(() => FocusManager, typeof(IFocusManager));
-            Locator.CurrentMutable.Register(() => InputManager, typeof(IInputManager));
-            Locator.CurrentMutable.Register(() => new KeyboardNavigationHandler(), typeof(IKeyboardNavigationHandler));
-            Locator.CurrentMutable.Register(() => _styler, typeof(IStyler));
-            Locator.CurrentMutable.Register(() => new LayoutManager(), typeof(ILayoutManager));
-            Locator.CurrentMutable.Register(() => new RenderManager(), typeof(IRenderManager));
+            PerspexLocator.CurrentMutable
+                .Bind<IAccessKeyHandler>().ToTransient<AccessKeyHandler>()
+                .Bind<IGlobalDataTemplates>().ToConstant(this)
+                .Bind<IGlobalStyles>().ToConstant(this)
+                .Bind<IFocusManager>().ToConstant(FocusManager)
+                .Bind<IInputManager>().ToConstant(InputManager)
+                .Bind<IKeyboardNavigationHandler>().ToTransient<KeyboardNavigationHandler>()
+                .Bind<IStyler>().ToConstant(_styler)
+                .Bind<ILayoutManager>().ToTransient<LayoutManager>()
+                .Bind<IRenderManager>().ToTransient<RenderManager>();
         }
 
         /// <summary>

+ 0 - 3
src/Perspex.Application/Perspex.Application.csproj

@@ -89,9 +89,6 @@
     <Reference Include="System.Reactive.PlatformServices">
       <HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 0 - 1
src/Perspex.Application/packages.config

@@ -5,5 +5,4 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 1 - 3
src/Perspex.Base/Perspex.Base.csproj

@@ -46,6 +46,7 @@
     <Compile Include="Diagnostics\PerspexObjectExtensions.cs" />
     <Compile Include="IObservablePropertyBag.cs" />
     <Compile Include="IPropertyBag.cs" />
+    <Compile Include="PerspexLocator.cs" />
     <Compile Include="Metadata\XmlnsDefinitionAttribute.cs" />
     <Compile Include="PerspexObjectExtensions.cs" />
     <Compile Include="PerspexProperty`1.cs" />
@@ -93,9 +94,6 @@
     <Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
       <HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 120 - 0
src/Perspex.Base/PerspexLocator.cs

@@ -0,0 +1,120 @@
+using System;
+using System.Collections.Generic;
+using System.Reactive.Disposables;
+
+#pragma warning disable CS1591 // Enable me later
+
+namespace Perspex
+{
+    public class PerspexLocator : IPerspexDependencyResolver
+    {
+        private readonly IPerspexDependencyResolver _parentScope;
+        public static IPerspexDependencyResolver Current { get; set; }
+        public static PerspexLocator CurrentMutable { get; set; }
+        private readonly Dictionary<Type, Func<object>> _registry = new Dictionary<Type, Func<object>>();
+
+        static PerspexLocator()
+        {
+            Current = CurrentMutable = new PerspexLocator();
+        }
+
+        public PerspexLocator()
+        {
+            
+        }
+
+        public PerspexLocator(IPerspexDependencyResolver parentScope)
+        {
+            _parentScope = parentScope;
+        }
+
+        public object GetService(Type t)
+        {
+            Func<object> rv;
+            return _registry.TryGetValue(t, out rv) ? rv() : _parentScope?.GetService(t);
+        }
+
+        public class RegistrationHelper<TService>
+        {
+            private PerspexLocator _locator;
+
+            public RegistrationHelper(PerspexLocator locator)
+            {
+                _locator = locator;
+            }
+
+            public PerspexLocator ToConstant<TImpl>(TImpl constant) where TImpl : TService
+            {
+                _locator._registry[typeof (TService)] = () => constant;
+                return _locator;
+            }
+
+            public PerspexLocator ToFunc<TImlp>(Func<TImlp> func) where TImlp : TService
+            {
+                _locator._registry[typeof (TService)] = () => func();
+                return _locator;
+            }
+
+            public PerspexLocator ToSingleton<TImpl>() where TImpl : class, TService, new()
+            {
+                TImpl instance = null;
+                return ToFunc(() => instance ?? (instance = new TImpl()));
+            }
+
+            public PerspexLocator ToTransient<TImpl>() where TImpl : class, TService, new() => ToFunc(() => new TImpl());
+        }
+
+        public RegistrationHelper<T> Bind<T>() => new RegistrationHelper<T>(this);
+
+
+        public PerspexLocator BindToSelf<T>(T constant)
+            => Bind<T>().ToConstant(constant);
+
+        public PerspexLocator BindToSelfSingleton<T>() where T : class, new() => Bind<T>().ToSingleton<T>();
+
+        class ResolverDisposable : IDisposable
+        {
+            private readonly IPerspexDependencyResolver _resolver;
+            private readonly PerspexLocator _mutable;
+
+            public ResolverDisposable(IPerspexDependencyResolver resolver, PerspexLocator mutable)
+            {
+                _resolver = resolver;
+                _mutable = mutable;
+            }
+
+            public void Dispose()
+            {
+                Current = _resolver;
+                CurrentMutable = _mutable;
+            }
+        }
+
+
+        public static IDisposable EnterScope()
+        {
+            return Disposable.Empty;
+            //Switch to that code when we are ready to fix tests
+            /*
+            var d = new ResolverDisposable(Current, CurrentMutable);
+            Current = CurrentMutable =  new PerspexLocator(Current);
+            return d;
+            */
+
+        }
+    }
+
+    public interface IPerspexDependencyResolver
+    {
+        object GetService(Type t);
+    }
+
+    public static class LocatorExtensions
+    {
+        public static T GetService<T>(this IPerspexDependencyResolver resolver)
+        {
+            return (T) resolver.GetService(typeof (T));
+        }
+    }
+}
+

+ 2 - 3
src/Perspex.Base/Threading/DispatcherTimer.cs

@@ -4,7 +4,6 @@
 using System;
 using System.Reactive.Disposables;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Threading
 {
@@ -175,7 +174,7 @@ namespace Perspex.Threading
         {
             if (!IsEnabled)
             {
-                IPlatformThreadingInterface threading = Locator.Current.GetService<IPlatformThreadingInterface>();
+                IPlatformThreadingInterface threading = PerspexLocator.Current.GetService<IPlatformThreadingInterface>();
                 _timer = threading.StartTimer(Interval, InternalTick);
             }
         }
@@ -187,7 +186,7 @@ namespace Perspex.Threading
         {
             if (IsEnabled)
             {
-                IPlatformThreadingInterface threading = Locator.Current.GetService<IPlatformThreadingInterface>();
+                IPlatformThreadingInterface threading = PerspexLocator.Current.GetService<IPlatformThreadingInterface>();
                 _timer.Dispose();
                 _timer = null;
             }

+ 1 - 2
src/Perspex.Base/Threading/MainLoop.cs

@@ -7,7 +7,6 @@ using System.Threading;
 using System.Threading.Tasks;
 using Perspex.Platform;
 using Perspex.Threading;
-using Splat;
 
 namespace Perspex.Win32.Threading
 {
@@ -25,7 +24,7 @@ namespace Perspex.Win32.Threading
         /// </summary>
         static MainLoop()
         {
-            s_platform = Locator.Current.GetService<IPlatformThreadingInterface>();
+            s_platform = PerspexLocator.Current.GetService<IPlatformThreadingInterface>();
         }
 
         /// <summary>

+ 0 - 1
src/Perspex.Base/packages.config

@@ -6,5 +6,4 @@
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 1 - 2
src/Perspex.Controls/Control.cs

@@ -12,7 +12,6 @@ using Perspex.Interactivity;
 using Perspex.LogicalTree;
 using Perspex.Rendering;
 using Perspex.Styling;
-using Splat;
 
 namespace Perspex.Controls
 {
@@ -397,7 +396,7 @@ namespace Perspex.Controls
         {
             base.OnAttachedToVisualTree(root);
 
-            IStyler styler = Locator.Current.GetService<IStyler>();
+            IStyler styler = PerspexLocator.Current.GetService<IStyler>();
             styler.ApplyStyles(this);
         }
 

+ 3 - 15
src/Perspex.Controls/MenuItem.cs

@@ -14,7 +14,6 @@ using Perspex.Input;
 using Perspex.Interactivity;
 using Perspex.Threading;
 using Perspex.VisualTree;
-using Splat;
 
 namespace Perspex.Controls
 {
@@ -489,7 +488,7 @@ namespace Perspex.Controls
         /// <summary>
         /// A dependency resolver which returns a <see cref="MenuItemAccessKeyHandler"/>.
         /// </summary>
-        private class DependencyResolver : IDependencyResolver
+        private class DependencyResolver : IPerspexDependencyResolver
         {
             /// <summary>
             /// Gets the default instance of <see cref="DependencyResolver"/>.
@@ -509,7 +508,7 @@ namespace Perspex.Controls
             /// <param name="serviceType">The service type.</param>
             /// <param name="contract">An optional contract.</param>
             /// <returns>A service of the requested type.</returns>
-            public object GetService(Type serviceType, string contract = null)
+            public object GetService(Type serviceType)
             {
                 if (serviceType == typeof(IAccessKeyHandler))
                 {
@@ -517,20 +516,9 @@ namespace Perspex.Controls
                 }
                 else
                 {
-                    return Locator.Current.GetService(serviceType, contract);
+                    return PerspexLocator.Current.GetService(serviceType);
                 }
             }
-
-            /// <summary>
-            /// Gets collection of services of the specified type.
-            /// </summary>
-            /// <param name="serviceType">The service type.</param>
-            /// <param name="contract">An optional contract.</param>
-            /// <returns>A collection of services of the requested type.</returns>
-            public IEnumerable<object> GetServices(Type serviceType, string contract = null)
-            {
-                return Locator.Current.GetServices(serviceType, contract);
-            }
         }
     }
 }

+ 0 - 3
src/Perspex.Controls/Perspex.Controls.csproj

@@ -187,9 +187,6 @@
     <Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
       <HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 1 - 2
src/Perspex.Controls/Primitives/Popup.cs

@@ -5,7 +5,6 @@ using System;
 using Perspex.Interactivity;
 using Perspex.Rendering;
 using Perspex.VisualTree;
-using Splat;
 
 namespace Perspex.Controls.Primitives
 {
@@ -94,7 +93,7 @@ namespace Perspex.Controls.Primitives
         /// This property allows a client to customize the behaviour of the popup by injecting
         /// a specialized dependency resolver into the <see cref="PopupRoot"/>'s constructor.
         /// </remarks>
-        public IDependencyResolver DependencyResolver
+        public IPerspexDependencyResolver DependencyResolver
         {
             get;
             set;

+ 2 - 3
src/Perspex.Controls/Primitives/PopupRoot.cs

@@ -8,7 +8,6 @@ using Perspex.Interactivity;
 using Perspex.Media;
 using Perspex.Platform;
 using Perspex.VisualTree;
-using Splat;
 
 namespace Perspex.Controls.Primitives
 {
@@ -41,8 +40,8 @@ namespace Perspex.Controls.Primitives
         /// <param name="dependencyResolver">
         /// The dependency resolver to use. If null the default dependency resolver will be used.
         /// </param>
-        public PopupRoot(IDependencyResolver dependencyResolver)
-            : base(Locator.Current.GetService<IPopupImpl>(), dependencyResolver)
+        public PopupRoot(IPerspexDependencyResolver dependencyResolver)
+            : base(PerspexLocator.Current.GetService<IPopupImpl>(), dependencyResolver)
         {
             GetObservable(ParentProperty).Subscribe(x => InheritanceParent = (PerspexObject)x);
         }

+ 2 - 3
src/Perspex.Controls/SystemDialog.cs

@@ -2,7 +2,6 @@
 using System.Linq;
 using System.Threading.Tasks;
 using Perspex.Controls.Platform;
-using Splat;
 
 namespace Perspex.Controls
 {
@@ -20,7 +19,7 @@ namespace Perspex.Controls
 
         public async Task<string> ShowAsync(Window window = null)
             =>
-                ((await Locator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl)) ??
+                ((await PerspexLocator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl)) ??
                  new string[0]).FirstOrDefault();
     }
 
@@ -29,7 +28,7 @@ namespace Perspex.Controls
         public bool AllowMultiple { get; set; }
 
         public Task<string[]> ShowAsync(Window window = null)
-            => Locator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl);
+            => PerspexLocator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl);
     }
 
     public abstract class SystemDialog

+ 1 - 2
src/Perspex.Controls/Templates/DataTemplateExtensions.cs

@@ -3,7 +3,6 @@
 
 using System.Linq;
 using Perspex.LogicalTree;
-using Splat;
 
 namespace Perspex.Controls.Templates
 {
@@ -63,7 +62,7 @@ namespace Perspex.Controls.Templates
                 }
             }
 
-            IGlobalDataTemplates global = Locator.Current.GetService<IGlobalDataTemplates>();
+            IGlobalDataTemplates global = PerspexLocator.Current.GetService<IGlobalDataTemplates>();
 
             if (global != null)
             {

+ 2 - 3
src/Perspex.Controls/TextBox.cs

@@ -2,7 +2,6 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 using Perspex.Input.Platform;
-using Splat;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -150,13 +149,13 @@ namespace Perspex.Controls
 
         private async void Copy()
         {
-            await ((IClipboard)Locator.Current.GetService(typeof(IClipboard)))
+            await ((IClipboard)PerspexLocator.Current.GetService(typeof(IClipboard)))
                 .SetTextAsync(GetSelection());
         }
 
         private async void Paste()
         {
-            var text = await ((IClipboard)Locator.Current.GetService(typeof(IClipboard))).GetTextAsync();
+            var text = await ((IClipboard)PerspexLocator.Current.GetService(typeof(IClipboard))).GetTextAsync();
             if (text == null)
             {
                 return;

+ 5 - 6
src/Perspex.Controls/TopLevel.cs

@@ -12,7 +12,6 @@ using Perspex.Platform;
 using Perspex.Rendering;
 using Perspex.Styling;
 using Perspex.Threading;
-using Splat;
 
 namespace Perspex.Controls
 {
@@ -87,7 +86,7 @@ namespace Perspex.Controls
         /// </summary>
         /// <param name="impl">The platform-specific window implementation.</param>
         public TopLevel(ITopLevelImpl impl)
-            : this(impl, Locator.Current)
+            : this(impl, PerspexLocator.Current)
         {
         }
 
@@ -98,7 +97,7 @@ namespace Perspex.Controls
         /// <param name="dependencyResolver">
         /// The dependency resolver to use. If null the default dependency resolver will be used.
         /// </param>
-        public TopLevel(ITopLevelImpl impl, IDependencyResolver dependencyResolver)
+        public TopLevel(ITopLevelImpl impl, IPerspexDependencyResolver dependencyResolver)
         {
             if (impl == null)
             {
@@ -108,7 +107,7 @@ namespace Perspex.Controls
 
             PlatformImpl = impl;
 
-            dependencyResolver = dependencyResolver ?? Locator.Current;
+            dependencyResolver = dependencyResolver ?? PerspexLocator.Current;
             var renderInterface = TryGetService<IPlatformRenderInterface>(dependencyResolver);
             var styler = TryGetService<IStyler>(dependencyResolver);
             _accessKeyHandler = TryGetService<IAccessKeyHandler>(dependencyResolver);
@@ -327,13 +326,13 @@ namespace Perspex.Controls
         }
 
         /// <summary>
-        /// Tries to get a service from an <see cref="IDependencyResolver"/>, throwing an
+        /// Tries to get a service from an <see cref="IPerspexDependencyResolver"/>, throwing an
         /// exception if not found.
         /// </summary>
         /// <typeparam name="T">The service type.</typeparam>
         /// <param name="resolver">The resolver.</param>
         /// <returns>The service.</returns>
-        private static T TryGetService<T>(IDependencyResolver resolver) where T : class
+        private static T TryGetService<T>(IPerspexDependencyResolver resolver) where T : class
         {
             var result = resolver.GetService<T>();
 

+ 1 - 2
src/Perspex.Controls/Window.cs

@@ -8,7 +8,6 @@ using Perspex.Input;
 using Perspex.Media;
 using Perspex.Platform;
 using Perspex.Styling;
-using Splat;
 
 namespace Perspex.Controls
 {
@@ -72,7 +71,7 @@ namespace Perspex.Controls
         /// Initializes a new instance of the <see cref="Window"/> class.
         /// </summary>
         public Window()
-            : base(Locator.Current.GetService<IWindowImpl>())
+            : base(PerspexLocator.Current.GetService<IWindowImpl>())
         {
             _maxPlatformClientSize = this.PlatformImpl.MaxClientSize;
         }

+ 0 - 1
src/Perspex.Controls/packages.config

@@ -6,5 +6,4 @@
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 1 - 2
src/Perspex.HtmlRenderer/Adapters/PerspexAdapter.cs

@@ -9,7 +9,6 @@ using Perspex;
 using Perspex.Input.Platform;
 using Perspex.Media;
 using Perspex.Media.Imaging;
-using Splat;
 using TheArtOfDev.HtmlRenderer.Adapters;
 using TheArtOfDev.HtmlRenderer.Adapters.Entities;
 using TheArtOfDev.HtmlRenderer.Perspex.Utilities;
@@ -118,7 +117,7 @@ namespace TheArtOfDev.HtmlRenderer.Perspex.Adapters
 
         protected override void SetToClipboardInt(string text)
         {
-            Locator.Current.GetService<IClipboard>().SetTextAsync(text);
+            PerspexLocator.Current.GetService<IClipboard>().SetTextAsync(text);
         }
 
         protected override void SetToClipboardInt(RImage image)

+ 0 - 3
src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj

@@ -172,9 +172,6 @@
     <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
-    <Reference Include="Splat">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
       <HintPath>..\..\packages\Rx-Core.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.Core.dll</HintPath>
     </Reference>

+ 0 - 1
src/Perspex.HtmlRenderer/packages.config

@@ -4,5 +4,4 @@
   <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="portable45-net45+win8" />
   <package id="Rx-Core" version="2.2.5" targetFramework="portable45-net45+win8" />
   <package id="Rx-Interfaces" version="2.2.5" targetFramework="portable45-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 1 - 2
src/Perspex.Input/Cursors.cs

@@ -1,7 +1,6 @@
 // Copyright (c) The Perspex Project. All rights reserved.
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
-using Splat;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -50,7 +49,7 @@ namespace Perspex.Input
 
         public Cursor(StandardCursorType cursorType)
             : this(
-                ((IStandardCursorFactory)Locator.Current.GetService(typeof(IStandardCursorFactory))).GetCursor(
+                ((IStandardCursorFactory)PerspexLocator.Current.GetService(typeof(IStandardCursorFactory))).GetCursor(
                     cursorType))
         {
         }

+ 1 - 2
src/Perspex.Input/FocusManager.cs

@@ -6,7 +6,6 @@ using System.Collections.Generic;
 using System.Linq;
 using Perspex.Interactivity;
 using Perspex.VisualTree;
-using Splat;
 
 namespace Perspex.Input
 {
@@ -35,7 +34,7 @@ namespace Perspex.Input
         /// <summary>
         /// Gets the instance of the <see cref="IFocusManager"/>.
         /// </summary>
-        public static IFocusManager Instance => Locator.Current.GetService<IFocusManager>();
+        public static IFocusManager Instance => PerspexLocator.Current.GetService<IFocusManager>();
 
         /// <summary>
         /// Gets the currently focused <see cref="IInputElement"/>.

+ 1 - 2
src/Perspex.Input/InputManager.cs

@@ -6,7 +6,6 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Reactive.Subjects;
 using Perspex.Input.Raw;
-using Splat;
 
 namespace Perspex.Input
 {
@@ -16,7 +15,7 @@ namespace Perspex.Input
 
         private readonly Subject<RawInputEventArgs> _postProcess = new Subject<RawInputEventArgs>();
 
-        public static IInputManager Instance => Locator.Current.GetService<IInputManager>();
+        public static IInputManager Instance => PerspexLocator.Current.GetService<IInputManager>();
 
         public IObservable<RawInputEventArgs> RawEventReceived => _rawEventReceived;
 

+ 3 - 4
src/Perspex.Input/KeyboardDevice.cs

@@ -8,7 +8,6 @@ using System.Reactive.Linq;
 using System.Runtime.CompilerServices;
 using Perspex.Input.Raw;
 using Perspex.Interactivity;
-using Splat;
 
 namespace Perspex.Input
 {
@@ -26,11 +25,11 @@ namespace Perspex.Input
 
         public event PropertyChangedEventHandler PropertyChanged;
 
-        public static IKeyboardDevice Instance => Locator.Current.GetService<IKeyboardDevice>();
+        public static IKeyboardDevice Instance => PerspexLocator.Current.GetService<IKeyboardDevice>();
 
-        public IInputManager InputManager => Locator.Current.GetService<IInputManager>();
+        public IInputManager InputManager => PerspexLocator.Current.GetService<IInputManager>();
 
-        public IFocusManager FocusManager => Locator.Current.GetService<IFocusManager>();
+        public IFocusManager FocusManager => PerspexLocator.Current.GetService<IFocusManager>();
 
         public IInputElement FocusedElement
         {

+ 3 - 4
src/Perspex.Input/MouseDevice.cs

@@ -9,7 +9,6 @@ using Perspex.Input.Raw;
 using Perspex.Interactivity;
 using Perspex.Platform;
 using Perspex.VisualTree;
-using Splat;
 
 namespace Perspex.Input
 {
@@ -31,7 +30,7 @@ namespace Perspex.Input
                 .Subscribe(ProcessRawEvent);
         }
 
-        public static IMouseDevice Instance => Locator.Current.GetService<IMouseDevice>();
+        public static IMouseDevice Instance => PerspexLocator.Current.GetService<IMouseDevice>();
 
         public IInputElement Captured
         {
@@ -39,7 +38,7 @@ namespace Perspex.Input
             protected set;
         }
 
-        public IInputManager InputManager => Locator.Current.GetService<IInputManager>();
+        public IInputManager InputManager => PerspexLocator.Current.GetService<IInputManager>();
 
         public Point Position
         {
@@ -107,7 +106,7 @@ namespace Perspex.Input
 
                 if (source != null)
                 {
-                    var settings = Locator.Current.GetService<IPlatformSettings>();
+                    var settings = PerspexLocator.Current.GetService<IPlatformSettings>();
                     var doubleClickTime = settings.DoubleClickTime.TotalMilliseconds;
 
                     if (!_lastClickRect.Contains(p) || timestamp - _lastClickTime > doubleClickTime)

+ 0 - 3
src/Perspex.Input/Perspex.Input.csproj

@@ -126,9 +126,6 @@
     <Reference Include="System.Reactive.PlatformServices">
       <HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 0 - 1
src/Perspex.Input/packages.config

@@ -5,5 +5,4 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 0 - 3
src/Perspex.Interactivity/Perspex.Interactivity.csproj

@@ -81,9 +81,6 @@
     <Reference Include="System.Reactive.PlatformServices">
       <HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 0 - 1
src/Perspex.Interactivity/packages.config

@@ -5,5 +5,4 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 0 - 3
src/Perspex.Layout/Perspex.Layout.csproj

@@ -80,9 +80,6 @@
     <Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
       <HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 0 - 1
src/Perspex.Layout/packages.config

@@ -6,5 +6,4 @@
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 1 - 2
src/Perspex.SceneGraph/Media/EllipseGeometry.cs

@@ -3,7 +3,6 @@
 
 using System;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Media
 {
@@ -18,7 +17,7 @@ namespace Perspex.Media
         /// <param name="rect">The rectangle that the ellipse should fill.</param>
         public EllipseGeometry(Rect rect)
         {
-            IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
+            IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
             IStreamGeometryImpl impl = factory.CreateStreamGeometry();
 
             using (IStreamGeometryContextImpl ctx = impl.Open())

+ 1 - 2
src/Perspex.SceneGraph/Media/FormattedText.cs

@@ -4,7 +4,6 @@
 using System;
 using System.Collections.Generic;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Media
 {
@@ -37,7 +36,7 @@ namespace Perspex.Media
             FontWeight = fontWeight;
             TextAlignment = textAlignment;
 
-            var platform = Locator.Current.GetService<IPlatformRenderInterface>();
+            var platform = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
 
             PlatformImpl = platform.CreateFormattedText(
                 text,

+ 3 - 4
src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs

@@ -3,7 +3,6 @@
 
 using System.IO;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Media.Imaging
 {
@@ -18,7 +17,7 @@ namespace Perspex.Media.Imaging
         /// <param name="fileName">The filename of the bitmap.</param>
         public Bitmap(string fileName)
         {
-            IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
+            IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
             PlatformImpl = factory.LoadBitmap(fileName);
         }
 
@@ -28,7 +27,7 @@ namespace Perspex.Media.Imaging
         /// <param name="stream">The stream to read the bitmap from.</param>
         public Bitmap(Stream stream)
         {
-            IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
+            IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
             PlatformImpl = factory.LoadBitmap(stream);
         }
 
@@ -39,7 +38,7 @@ namespace Perspex.Media.Imaging
         /// <param name="height">The height of the bitmap, in pixels.</param>
         public Bitmap(int width, int height)
         {
-            IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
+            IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
             PlatformImpl = factory.CreateBitmap(width, height);
         }
 

+ 1 - 2
src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs

@@ -3,7 +3,6 @@
 
 using System;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Media.Imaging
 {
@@ -55,7 +54,7 @@ namespace Perspex.Media.Imaging
         /// <returns>The platform-specific implementation.</returns>
         private static IBitmapImpl CreateImpl(int width, int height)
         {
-            IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
+            IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
             return factory.CreateRenderTargetBitmap(width, height);
         }
     }

+ 1 - 2
src/Perspex.SceneGraph/Media/RectangleGeometry.cs

@@ -2,7 +2,6 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Media
 {
@@ -17,7 +16,7 @@ namespace Perspex.Media
         /// <param name="rect">The rectangle bounds.</param>
         public RectangleGeometry(Rect rect)
         {
-            IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
+            IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
             IStreamGeometryImpl impl = factory.CreateStreamGeometry();
 
             using (IStreamGeometryContextImpl context = impl.Open())

+ 1 - 2
src/Perspex.SceneGraph/Media/StreamGeometry.cs

@@ -2,7 +2,6 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Media
 {
@@ -16,7 +15,7 @@ namespace Perspex.Media
         /// </summary>
         public StreamGeometry()
         {
-            IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
+            IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
             PlatformImpl = factory.CreateStreamGeometry();
         }
 

+ 0 - 3
src/Perspex.SceneGraph/Perspex.SceneGraph.csproj

@@ -143,9 +143,6 @@
     <Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
       <HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 0 - 1
src/Perspex.SceneGraph/packages.config

@@ -6,5 +6,4 @@
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 0 - 3
src/Perspex.Styling/Perspex.Styling.csproj

@@ -77,9 +77,6 @@
     <Reference Include="System.Reactive.PlatformServices">
       <HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 1 - 2
src/Perspex.Styling/Styling/Styler.cs

@@ -4,7 +4,6 @@
 using System;
 using System.Linq;
 using Perspex.VisualTree;
-using Splat;
 
 namespace Perspex.Styling
 {
@@ -17,7 +16,7 @@ namespace Perspex.Styling
                 .GetSelfAndVisualAncestors()
                 .OfType<IStyleHost>()
                 .FirstOrDefault();
-            IGlobalStyles global = Locator.Current.GetService<IGlobalStyles>();
+            IGlobalStyles global = PerspexLocator.Current.GetService<IGlobalStyles>();
 
             if (global != null)
             {

+ 0 - 3
src/Perspex.Themes.Default/Perspex.Themes.Default.csproj

@@ -118,9 +118,6 @@
     <Reference Include="System.Reactive.PlatformServices">
       <HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />

+ 0 - 1
src/Perspex.Themes.Default/packages.config

@@ -5,5 +5,4 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
-  <package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
 </packages>

+ 3 - 4
src/Shared/PlatformSupport/SharedPlatform.cs

@@ -2,7 +2,6 @@
 using System.Collections.Generic;
 using System.Text;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Shared.PlatformSupport
 {
@@ -10,9 +9,9 @@ namespace Perspex.Shared.PlatformSupport
     {
         public static void Register()
         {
-            var locator = Locator.CurrentMutable;
-            locator.Register(() => new PclPlatformWrapper(), typeof(IPclPlatformWrapper));
-            locator.RegisterConstant(new AssetLoader(), typeof(IAssetLoader));
+            PerspexLocator.CurrentMutable
+                .Bind<IPclPlatformWrapper>().ToSingleton<PclPlatformWrapper>()
+                .Bind<IAssetLoader>().ToSingleton<AssetLoader>();
         }
     }
 }

+ 5 - 9
src/Windows/Perspex.Direct2D1/Direct2D1Platform.cs

@@ -6,7 +6,6 @@ using System.IO;
 using Perspex.Direct2D1.Media;
 using Perspex.Media;
 using Perspex.Platform;
-using Splat;
 
 namespace Perspex.Direct2D1
 {
@@ -20,14 +19,11 @@ namespace Perspex.Direct2D1
 
         private static readonly SharpDX.WIC.ImagingFactory s_imagingFactory = new SharpDX.WIC.ImagingFactory();
 
-        public static void Initialize()
-        {
-            var locator = Locator.CurrentMutable;
-            locator.Register(() => s_instance, typeof(IPlatformRenderInterface));
-            locator.Register(() => s_d2D1Factory, typeof(SharpDX.Direct2D1.Factory));
-            locator.Register(() => s_dwfactory, typeof(SharpDX.DirectWrite.Factory));
-            locator.Register(() => s_imagingFactory, typeof(SharpDX.WIC.ImagingFactory));
-        }
+        public static void Initialize() => PerspexLocator.CurrentMutable
+            .Bind<IPlatformRenderInterface>().ToConstant(s_instance)
+            .BindToSelf(s_d2D1Factory)
+            .BindToSelf(s_dwfactory)
+            .BindToSelf(s_imagingFactory);
 
         public IBitmapImpl CreateBitmap(int width, int height)
         {

+ 1 - 2
src/Windows/Perspex.Direct2D1/Media/FormattedTextImpl.cs

@@ -6,7 +6,6 @@ using System.Collections.Generic;
 using System.Linq;
 using Perspex.Media;
 using Perspex.Platform;
-using Splat;
 using DWrite = SharpDX.DirectWrite;
 
 namespace Perspex.Direct2D1.Media
@@ -21,7 +20,7 @@ namespace Perspex.Direct2D1.Media
             TextAlignment textAlignment,
             FontWeight fontWeight)
         {
-            var factory = Locator.Current.GetService<DWrite.Factory>();
+            var factory = PerspexLocator.Current.GetService<DWrite.Factory>();
 
             var format = new DWrite.TextFormat(
                 factory,

+ 1 - 2
src/Windows/Perspex.Direct2D1/Media/GeometryImpl.cs

@@ -3,7 +3,6 @@
 
 using Perspex.Platform;
 using SharpDX.Direct2D1;
-using Splat;
 
 namespace Perspex.Direct2D1.Media
 {
@@ -59,7 +58,7 @@ namespace Perspex.Direct2D1.Media
 
                     if (!value.IsIdentity)
                     {
-                        Factory factory = Locator.Current.GetService<Factory>();
+                        Factory factory = PerspexLocator.Current.GetService<Factory>();
                         _transformed = new TransformedGeometry(
                             factory,
                             DefiningGeometry,

+ 2 - 3
src/Windows/Perspex.Direct2D1/Media/StreamGeometryImpl.cs

@@ -4,7 +4,6 @@
 using Perspex.Media;
 using Perspex.Platform;
 using SharpDX.Direct2D1;
-using Splat;
 using D2DGeometry = SharpDX.Direct2D1.Geometry;
 
 namespace Perspex.Direct2D1.Media
@@ -21,7 +20,7 @@ namespace Perspex.Direct2D1.Media
         /// </summary>
         public StreamGeometryImpl()
         {
-            Factory factory = Locator.Current.GetService<Factory>();
+            Factory factory = PerspexLocator.Current.GetService<Factory>();
             _path = new PathGeometry(factory);
         }
 
@@ -46,7 +45,7 @@ namespace Perspex.Direct2D1.Media
         /// <returns>A cloned geometry.</returns>
         public IStreamGeometryImpl Clone()
         {
-            Factory factory = Locator.Current.GetService<Factory>();
+            Factory factory = PerspexLocator.Current.GetService<Factory>();
             var result = new PathGeometry(factory);
             var sink = result.Open();
             _path.Stream(sink);

+ 0 - 3
src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj

@@ -64,9 +64,6 @@
     <Reference Include="System.Reactive.PlatformServices">
       <HintPath>..\..\..\packages\Rx-PlatformServices.2.2.5\lib\net45\System.Reactive.PlatformServices.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\..\Shared\SharedAssemblyInfo.cs">

+ 4 - 5
src/Windows/Perspex.Direct2D1/Renderer.cs

@@ -8,7 +8,6 @@ using Perspex.Platform;
 using Perspex.Rendering;
 using SharpDX;
 using SharpDX.Direct2D1;
-using Splat;
 using DwFactory = SharpDX.DirectWrite.Factory;
 
 namespace Perspex.Direct2D1
@@ -28,8 +27,8 @@ namespace Perspex.Direct2D1
         /// <param name="height">The height of the window.</param>
         public Renderer(IntPtr hwnd, double width, double height)
         {
-            Direct2DFactory = Locator.Current.GetService<Factory>();
-            DirectWriteFactory = Locator.Current.GetService<DwFactory>();
+            Direct2DFactory = PerspexLocator.Current.GetService<Factory>();
+            DirectWriteFactory = PerspexLocator.Current.GetService<DwFactory>();
 
             RenderTargetProperties renderTargetProperties = new RenderTargetProperties
             {
@@ -54,8 +53,8 @@ namespace Perspex.Direct2D1
         /// <param name="renderTarget">The render target.</param>
         public Renderer(RenderTarget renderTarget)
         {
-            Direct2DFactory = Locator.Current.GetService<Factory>();
-            DirectWriteFactory = Locator.Current.GetService<DwFactory>();
+            Direct2DFactory = PerspexLocator.Current.GetService<Factory>();
+            DirectWriteFactory = PerspexLocator.Current.GetService<DwFactory>();
             _renderTarget = renderTarget;
         }
 

+ 0 - 1
src/Windows/Perspex.Direct2D1/packages.config

@@ -6,5 +6,4 @@
   <package id="SharpDX" version="2.6.3" targetFramework="net45" />
   <package id="SharpDX.Direct2D1" version="2.6.3" targetFramework="net45" />
   <package id="SharpDX.DXGI" version="2.6.3" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
 </packages>

+ 0 - 3
src/Windows/Perspex.Win32/Perspex.Win32.csproj

@@ -58,9 +58,6 @@
     <Reference Include="System.Reactive.PlatformServices">
       <HintPath>..\..\..\packages\Rx-PlatformServices.2.2.5\lib\net45\System.Reactive.PlatformServices.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\..\Shared\SharedAssemblyInfo.cs">

+ 12 - 14
src/Windows/Perspex.Win32/Win32Platform.cs

@@ -14,7 +14,6 @@ using Perspex.Platform;
 using Perspex.Shared.PlatformSupport;
 using Perspex.Win32.Input;
 using Perspex.Win32.Interop;
-using Splat;
 
 namespace Perspex.Win32
 {
@@ -41,29 +40,28 @@ namespace Perspex.Win32
 
         private static void InitializeInternal()
         {
-            var locator = Locator.CurrentMutable;
-            locator.Register(() => new SystemDialogImpl(), typeof (ISystemDialogImpl));
-            locator.Register(() => new PopupImpl(), typeof(IPopupImpl));
-            locator.Register(() => new ClipboardImpl(), typeof(IClipboard));
-            locator.Register(() => WindowsKeyboardDevice.Instance, typeof(IKeyboardDevice));
-            locator.Register(() => WindowsMouseDevice.Instance, typeof(IMouseDevice));
-            locator.Register(() => CursorFactory.Instance, typeof(IStandardCursorFactory));
-            locator.Register(() => s_instance, typeof(IPlatformSettings));
-            locator.Register(() => s_instance, typeof(IPlatformThreadingInterface));
+            PerspexLocator.CurrentMutable
+                .Bind<IPopupImpl>().ToTransient<PopupImpl>()
+                .Bind<IClipboard>().ToSingleton<ClipboardImpl>()
+                .Bind<IStandardCursorFactory>().ToConstant(CursorFactory.Instance)
+                .Bind<IKeyboardDevice>().ToConstant(WindowsKeyboardDevice.Instance)
+                .Bind<IMouseDevice>().ToConstant(WindowsMouseDevice.Instance)
+                .Bind<IPlatformSettings>().ToConstant(s_instance)
+                .Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
+                .Bind<ISystemDialogImpl>().ToSingleton<SystemDialogImpl>();
+
             SharedPlatform.Register();
         }
 
         public static void Initialize()
         {
-            var locator = Locator.CurrentMutable;
-            locator.Register(() => new WindowImpl(), typeof(IWindowImpl));
+            PerspexLocator.CurrentMutable.Bind<IWindowImpl>().ToTransient<WindowImpl>();
             InitializeInternal();
         }
 
         public static void InitializeEmbedded()
         {
-            var locator = Locator.CurrentMutable;
-            locator.Register(() => new EmbeddedWindowImpl(), typeof(IWindowImpl));
+            PerspexLocator.CurrentMutable.Bind<IWindowImpl>().ToTransient<EmbeddedWindowImpl>();
             InitializeInternal();
         }
 

+ 0 - 1
src/Windows/Perspex.Win32/packages.config

@@ -5,5 +5,4 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
   <package id="Rx-Main" version="2.2.5" targetFramework="net45" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
 </packages>

+ 0 - 3
tests/Perspex.Base.UnitTests/Perspex.Base.UnitTests.csproj

@@ -47,9 +47,6 @@
     <Reference Include="xunit.core">
       <HintPath>..\..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="System.Reactive.Core">
       <HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.Base.UnitTests/packages.config

@@ -3,7 +3,6 @@
   <package id="Rx-Core" version="2.2.5" targetFramework="net45" />
   <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
   <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 4 - 4
tests/Perspex.Controls.UnitTests/ContentControlTests.cs

@@ -13,7 +13,6 @@ using Perspex.Styling;
 using Perspex.VisualTree;
 using Ploeh.AutoFixture;
 using Ploeh.AutoFixture.AutoMoq;
-using Splat;
 using Xunit;
 
 namespace Perspex.Controls.UnitTests
@@ -49,7 +48,7 @@ namespace Perspex.Controls.UnitTests
                 var target = new ContentControl();
                 var styler = new Mock<IStyler>();
 
-                Locator.CurrentMutable.Register(() => styler.Object, typeof(IStyler));
+                PerspexLocator.CurrentMutable.Bind<IStyler>().ToConstant(styler.Object);
                 target.Content = "Foo";
                 target.Template = GetTemplate();
                 root.Child = target;
@@ -281,10 +280,11 @@ namespace Perspex.Controls.UnitTests
 
         private IDisposable RegisterServices()
         {
-            var result = Locator.CurrentMutable.WithResolver();
+            var result = PerspexLocator.EnterScope();
             var fixture = new Fixture().Customize(new AutoMoqCustomization());
             var renderInterface = fixture.Create<IPlatformRenderInterface>();
-            Locator.CurrentMutable.RegisterConstant(renderInterface, typeof(IPlatformRenderInterface));
+            PerspexLocator.CurrentMutable
+                .Bind<IPlatformRenderInterface>().ToConstant(renderInterface);
             return result;
         }
     }

+ 4 - 5
tests/Perspex.Controls.UnitTests/ControlTests.cs

@@ -7,7 +7,6 @@ using Perspex.Layout;
 using Perspex.Platform;
 using Perspex.Rendering;
 using Perspex.Styling;
-using Splat;
 using Xunit;
 
 namespace Perspex.Controls.UnitTests
@@ -25,13 +24,13 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Adding_Control_To_IRenderRoot_Should_Style_Control()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 var root = new TestRoot();
                 var target = new Control();
                 var styler = new Mock<IStyler>();
 
-                Locator.CurrentMutable.Register(() => styler.Object, typeof(IStyler));
+                PerspexLocator.CurrentMutable.Bind<IStyler>().ToConstant(styler.Object);
 
                 root.Child = target;
 
@@ -42,7 +41,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Adding_Tree_To_ILayoutRoot_Should_Style_Controls()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 var root = new TestRoot();
                 var parent = new Border();
@@ -50,7 +49,7 @@ namespace Perspex.Controls.UnitTests
                 var grandchild = new Control();
                 var styler = new Mock<IStyler>();
 
-                Locator.CurrentMutable.Register(() => styler.Object, typeof(IStyler));
+                PerspexLocator.CurrentMutable.Bind<IStyler>().ToConstant(styler.Object);
 
                 parent.Child = child;
                 child.Child = grandchild;

+ 3 - 3
tests/Perspex.Controls.UnitTests/DropDownTests.cs

@@ -9,7 +9,6 @@ using Perspex.Controls.Templates;
 using Perspex.Platform;
 using Ploeh.AutoFixture;
 using Ploeh.AutoFixture.AutoMoq;
-using Splat;
 using Xunit;
 
 namespace Perspex.Controls.UnitTests
@@ -58,10 +57,11 @@ namespace Perspex.Controls.UnitTests
 
         private IDisposable RegisterServices()
         {
-            var result = Locator.CurrentMutable.WithResolver();
+            var result = PerspexLocator.EnterScope();
             var fixture = new Fixture().Customize(new AutoMoqCustomization());
             var renderInterface = fixture.Create<IPlatformRenderInterface>();
-            Locator.CurrentMutable.RegisterConstant(renderInterface, typeof(IPlatformRenderInterface));
+            PerspexLocator.CurrentMutable.Bind<IPlatformRenderInterface>().ToConstant(renderInterface);
+
             return result;
         }
     }

+ 0 - 3
tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj

@@ -59,9 +59,6 @@
     <Reference Include="Ploeh.AutoFixture.AutoMoq, Version=3.31.1.0, Culture=neutral, PublicKeyToken=b24654c590009d4f">
       <HintPath>..\..\packages\AutoFixture.AutoMoq.3.31.1\lib\net40\Ploeh.AutoFixture.AutoMoq.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="System.Reactive.Core">
       <HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath>
     </Reference>

+ 9 - 7
tests/Perspex.Controls.UnitTests/Primitives/PopupTests.cs

@@ -13,7 +13,6 @@ using Perspex.LogicalTree;
 using Perspex.Platform;
 using Perspex.Styling;
 using Perspex.VisualTree;
-using Splat;
 using Xunit;
 
 namespace Perspex.Controls.UnitTests.Primitives
@@ -248,7 +247,7 @@ namespace Perspex.Controls.UnitTests.Primitives
 
         private static IDisposable CreateServices()
         {
-            var result = Locator.Current.WithResolver();
+            var result = PerspexLocator.EnterScope();
 
             var styles = new Styles
             {
@@ -264,11 +263,14 @@ namespace Perspex.Controls.UnitTests.Primitives
             var globalStyles = new Mock<IGlobalStyles>();
             globalStyles.Setup(x => x.Styles).Returns(styles);
 
-            Locator.CurrentMutable.Register(() => globalStyles.Object, typeof(IGlobalStyles));
-            Locator.CurrentMutable.Register(() => new LayoutManager(), typeof(ILayoutManager));
-            Locator.CurrentMutable.Register(() => new Mock<IPlatformThreadingInterface>().Object, typeof(IPlatformThreadingInterface));
-            Locator.CurrentMutable.Register(() => new Mock<IPopupImpl>().Object, typeof(IPopupImpl));
-            Locator.CurrentMutable.Register(() => new Styler(), typeof(IStyler));
+
+            PerspexLocator.CurrentMutable
+                .Bind<ILayoutManager>().ToTransient<LayoutManager>()
+                .Bind<IGlobalStyles>().ToFunc(() => globalStyles.Object)
+                .Bind<IPlatformThreadingInterface>().ToConstant(new Mock<IPlatformThreadingInterface>().Object)
+                .Bind<IPopupImpl>().ToConstant(new Mock<IPopupImpl>().Object)
+                .Bind<IStyler>().ToTransient<Styler>();
+
             return result;
         }
 

+ 3 - 3
tests/Perspex.Controls.UnitTests/TemplatedControlTests.cs

@@ -9,7 +9,6 @@ using Perspex.Controls.Primitives;
 using Perspex.Controls.Templates;
 using Perspex.Styling;
 using Perspex.VisualTree;
-using Splat;
 using Xunit;
 
 namespace Perspex.Controls.UnitTests
@@ -143,10 +142,11 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Templated_Children_Should_Be_Styled()
         {
-            using (Locator.Current.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 var styler = new Mock<IStyler>();
-                Locator.CurrentMutable.Register(() => styler.Object, typeof(IStyler));
+
+                PerspexLocator.CurrentMutable.Bind<IStyler>().ToConstant(styler.Object);
 
                 TestTemplatedControl target;
 

+ 29 - 28
tests/Perspex.Controls.UnitTests/TopLevelTests.cs

@@ -14,7 +14,6 @@ using Perspex.Rendering;
 using Perspex.Styling;
 using Ploeh.AutoFixture;
 using Ploeh.AutoFixture.AutoMoq;
-using Splat;
 using Xunit;
 
 namespace Perspex.Controls.UnitTests
@@ -24,7 +23,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void ClientSize_Should_Be_Set_On_Construction()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -40,7 +39,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Width_Should_Not_Be_Set_On_Construction()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -56,7 +55,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Height_Should_Not_Be_Set_On_Construction()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -72,7 +71,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Layout_Pass_Should_Not_Be_Automatically_Scheduled()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -88,10 +87,10 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Bounds_Should_Be_Set_After_Layout_Pass()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
-                Locator.CurrentMutable.RegisterConstant(new LayoutManager(), typeof(ILayoutManager));
+                PerspexLocator.CurrentMutable.Bind<ILayoutManager>().ToConstant(new LayoutManager());
 
                 var impl = new Mock<ITopLevelImpl>();
                 impl.SetupProperty(x => x.ClientSize);
@@ -120,10 +119,10 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Impl_ClientSize_Should_Be_Set_After_Layout_Pass()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
-                Locator.CurrentMutable.RegisterConstant(new LayoutManager(), typeof(ILayoutManager));
+                PerspexLocator.CurrentMutable.Bind<ILayoutManager>().ToConstant(new LayoutManager());
 
                 var impl = new Mock<ITopLevelImpl>();
 
@@ -150,7 +149,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Width_And_Height_Should_Not_Be_Set_After_Layout_Pass()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -168,11 +167,11 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Render_Should_Be_Scheduled_After_Layout_Pass()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
                 var completed = new Subject<Unit>();
-                var layoutManagerMock = Mock.Get(Locator.Current.GetService<ILayoutManager>());
+                var layoutManagerMock = Mock.Get(PerspexLocator.Current.GetService<ILayoutManager>());
                 layoutManagerMock.Setup(x => x.LayoutCompleted).Returns(completed);
 
                 var impl = new Mock<ITopLevelImpl>();
@@ -181,7 +180,7 @@ namespace Perspex.Controls.UnitTests
                 var target = new TestTopLevel(impl.Object);
                 completed.OnNext(Unit.Default);
 
-                var renderManagerMock = Mock.Get(Locator.Current.GetService<IRenderManager>());
+                var renderManagerMock = Mock.Get(PerspexLocator.Current.GetService<IRenderManager>());
                 renderManagerMock.Verify(x => x.InvalidateRender(target));
             }
         }
@@ -189,7 +188,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Width_And_Height_Should_Be_Set_After_Window_Resize_Notification()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -209,7 +208,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Activate_Should_Call_Impl_Activate()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -225,7 +224,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Impl_Activate_Should_Call_Raise_Activated_Event()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -245,7 +244,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Impl_Close_Should_Call_Raise_Closed_Event()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -265,7 +264,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Impl_Deactivate_Should_Call_Raise_Activated_Event()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -285,7 +284,7 @@ namespace Perspex.Controls.UnitTests
         [Fact]
         public void Impl_Input_Should_Pass_Input_To_InputManager()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -308,7 +307,7 @@ namespace Perspex.Controls.UnitTests
         private void RegisterServices()
         {
             var fixture = new Fixture().Customize(new AutoMoqCustomization());
-            var l = Locator.CurrentMutable;
+            var l = PerspexLocator.CurrentMutable;
 
             var formattedText = fixture.Create<IFormattedTextImpl>();
             var globalStyles = new Mock<IGlobalStyles>();
@@ -320,14 +319,16 @@ namespace Perspex.Controls.UnitTests
 
             globalStyles.Setup(x => x.Styles).Returns(theme);
 
-            l.RegisterConstant(new Mock<IInputManager>().Object, typeof(IInputManager));
-            l.RegisterConstant(new Mock<IFocusManager>().Object, typeof(IFocusManager));
-            l.RegisterConstant(globalStyles.Object, typeof(IGlobalStyles));
-            l.RegisterConstant(layoutManager, typeof(ILayoutManager));
-            l.RegisterConstant(new Mock<IPlatformThreadingInterface>().Object, typeof(IPlatformThreadingInterface));
-            l.RegisterConstant(renderInterface, typeof(IPlatformRenderInterface));
-            l.RegisterConstant(renderManager, typeof(IRenderManager));
-            l.RegisterConstant(new Styler(), typeof(IStyler));
+
+            PerspexLocator.CurrentMutable
+                .Bind<IInputManager>().ToConstant(new Mock<IInputManager>().Object)
+                .Bind<IFocusManager>().ToConstant(new Mock<IFocusManager>().Object)
+                .Bind<IGlobalStyles>().ToConstant(globalStyles.Object)
+                .Bind<ILayoutManager>().ToConstant(layoutManager)
+                .Bind<IPlatformRenderInterface>().ToConstant(renderInterface)
+                .Bind<IPlatformThreadingInterface>().ToConstant(new Mock<IPlatformThreadingInterface>().Object)
+                .Bind<IRenderManager>().ToConstant(renderManager)
+                .Bind<IStyler>().ToConstant(new Styler());
         }
 
         private class TestTopLevel : TopLevel

+ 0 - 1
tests/Perspex.Controls.UnitTests/packages.config

@@ -8,7 +8,6 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
   <package id="Rx-Main" version="2.2.5" targetFramework="net45" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 2 - 3
tests/Perspex.Direct2D1.UnitTests/Controls/Shapes/PathTests.cs

@@ -4,7 +4,6 @@
 using Perspex.Controls.Shapes;
 using Perspex.Layout;
 using Perspex.Media;
-using Splat;
 using Xunit;
 
 namespace Perspex.Direct2D1.UnitTests.Controls.Shapes
@@ -16,7 +15,7 @@ namespace Perspex.Direct2D1.UnitTests.Controls.Shapes
         [Fact]
         public void Should_Measure_Expander_Triangle_Correctly()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 Direct2D1Platform.Initialize();
 
@@ -39,7 +38,7 @@ namespace Perspex.Direct2D1.UnitTests.Controls.Shapes
         [Fact]
         public void Should_Measure_Expander_Triangle_With_Stroke_Correctly()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 Direct2D1Platform.Initialize();
 

+ 2 - 3
tests/Perspex.Direct2D1.UnitTests/Media/GeometryTests.cs

@@ -2,7 +2,6 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 using Perspex.Media;
-using Splat;
 using Xunit;
 
 namespace Perspex.Direct2D1.UnitTests.Media
@@ -14,7 +13,7 @@ namespace Perspex.Direct2D1.UnitTests.Media
         [Fact]
         public void Should_Measure_Expander_Triangle_Correctly()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 Direct2D1Platform.Initialize();
 
@@ -27,7 +26,7 @@ namespace Perspex.Direct2D1.UnitTests.Media
         [Fact]
         public void Should_Measure_Expander_Triangle_With_Stroke_Correctly()
         {
-            using (Locator.CurrentMutable.WithResolver())
+            using (PerspexLocator.EnterScope())
             {
                 Direct2D1Platform.Initialize();
 

+ 0 - 3
tests/Perspex.Direct2D1.UnitTests/Perspex.Direct2D1.UnitTests.csproj

@@ -44,9 +44,6 @@
     <Reference Include="System.Data" />
     <Reference Include="System.Net.Http" />
     <Reference Include="System.Xml" />
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c">
       <HintPath>..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.Direct2D1.UnitTests/packages.config

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 0 - 3
tests/Perspex.Input.UnitTests/Perspex.Input.UnitTests.csproj

@@ -44,9 +44,6 @@
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c">
       <HintPath>..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.Input.UnitTests/packages.config

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 0 - 3
tests/Perspex.Interactivity.UnitTests/Perspex.Interactivity.UnitTests.csproj

@@ -49,9 +49,6 @@
     <Reference Include="xunit.core">
       <HintPath>..\..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c">
       <HintPath>..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.Interactivity.UnitTests/packages.config

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 12 - 12
tests/Perspex.Layout.UnitTests/FullLayoutTests.cs

@@ -17,7 +17,6 @@ using Perspex.Styling;
 using Perspex.Themes.Default;
 using Ploeh.AutoFixture;
 using Ploeh.AutoFixture.AutoMoq;
-using Splat;
 using Xunit;
 
 namespace Perspex.Layout.UnitTests
@@ -27,7 +26,7 @@ namespace Perspex.Layout.UnitTests
         [Fact]
         public void Grandchild_Size_Changed()
         {
-            using (var context = Locator.CurrentMutable.WithResolver())
+            using (var context = PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -66,7 +65,7 @@ namespace Perspex.Layout.UnitTests
         [Fact]
         public void Test_ScrollViewer_With_TextBlock()
         {
-            using (var context = Locator.CurrentMutable.WithResolver())
+            using (var context = PerspexLocator.EnterScope())
             {
                 RegisterServices();
 
@@ -130,7 +129,7 @@ namespace Perspex.Layout.UnitTests
         private void RegisterServices()
         {
             var fixture = new Fixture().Customize(new AutoMoqCustomization());
-            var l = Locator.CurrentMutable;
+
 
             var formattedText = fixture.Create<IFormattedTextImpl>();
             var globalStyles = new Mock<IGlobalStyles>();
@@ -143,14 +142,15 @@ namespace Perspex.Layout.UnitTests
             windowImpl.Setup(x => x.MaxClientSize).Returns(new Size(1024, 1024));
             globalStyles.Setup(x => x.Styles).Returns(theme);
 
-            l.RegisterConstant(new Mock<IInputManager>().Object, typeof(IInputManager));
-            l.RegisterConstant(globalStyles.Object, typeof(IGlobalStyles));
-            l.RegisterConstant(new LayoutManager(), typeof(ILayoutManager));
-            l.RegisterConstant(renderInterface, typeof(IPlatformRenderInterface));
-            l.RegisterConstant(new Mock<IPlatformThreadingInterface>().Object, typeof(IPlatformThreadingInterface));
-            l.RegisterConstant(renderManager, typeof(IRenderManager));
-            l.RegisterConstant(new Styler(), typeof(IStyler));
-            l.RegisterConstant(windowImpl.Object, typeof(IWindowImpl));
+            PerspexLocator.CurrentMutable
+                .Bind<IInputManager>().ToConstant(new Mock<IInputManager>().Object)
+                .Bind<IGlobalStyles>().ToConstant(globalStyles.Object)
+                .Bind<ILayoutManager>().ToConstant(new LayoutManager())
+                .Bind<IPlatformRenderInterface>().ToConstant(renderInterface)
+                .Bind<IPlatformThreadingInterface>().ToConstant(new Mock<IPlatformThreadingInterface>().Object)
+                .Bind<IRenderManager>().ToConstant(renderManager)
+                .Bind<IStyler>().ToConstant(new Styler())
+                .Bind<IWindowImpl>().ToConstant(windowImpl.Object);
         }
     }
 }

+ 0 - 3
tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj

@@ -56,9 +56,6 @@
     <Reference Include="Ploeh.AutoFixture.AutoMoq, Version=3.31.1.0, Culture=neutral, PublicKeyToken=b24654c590009d4f">
       <HintPath>..\..\packages\AutoFixture.AutoMoq.3.31.1\lib\net40\Ploeh.AutoFixture.AutoMoq.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c">
       <HintPath>..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.Layout.UnitTests/packages.config

@@ -3,7 +3,6 @@
   <package id="AutoFixture" version="3.31.3" targetFramework="net45" />
   <package id="AutoFixture.AutoMoq" version="3.31.1" targetFramework="net45" />
   <package id="Moq" version="4.2.1507.0118" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 0 - 3
tests/Perspex.RenderTests/Perspex.Cairo.RenderTests.csproj

@@ -53,9 +53,6 @@
     <Reference Include="Magick.NET.Core, Version=7.0.0.0, Culture=neutral, PublicKeyToken=2004825badfa91ec">
       <HintPath>..\..\packages\Magick.NET-Q16-AnyCPU.7.0.0.0018\lib\net40-client\Magick.NET.Core.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c">
       <HintPath>..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.RenderTests/packages.config

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="Magick.NET-Q16-AnyCPU" version="7.0.0.0018" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 0 - 3
tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj

@@ -47,9 +47,6 @@
     <Reference Include="xunit.core">
       <HintPath>..\..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
       <HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.SceneGraph.UnitTests/packages.config

@@ -5,7 +5,6 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
   <package id="Rx-Main" version="2.2.5" targetFramework="net45" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />

+ 0 - 3
tests/Perspex.Styling.UnitTests/Perspex.Styling.UnitTests.csproj

@@ -50,9 +50,6 @@
     <Reference Include="Moq, Version=4.2.1507.118, Culture=neutral, PublicKeyToken=69f491c39445e920">
       <HintPath>..\..\packages\Moq.4.2.1507.0118\lib\net40\Moq.dll</HintPath>
     </Reference>
-    <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
-      <HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
-    </Reference>
     <Reference Include="System.Reactive.Core">
       <HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath>
     </Reference>

+ 0 - 1
tests/Perspex.Styling.UnitTests/packages.config

@@ -6,7 +6,6 @@
   <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
   <package id="Rx-Main" version="2.2.5" targetFramework="net45" />
   <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
-  <package id="Splat" version="1.6.2" targetFramework="net45" />
   <package id="xunit" version="2.0.0" targetFramework="net45" />
   <package id="xunit.abstractions" version="2.0.0" targetFramework="net45" />
   <package id="xunit.assert" version="2.0.0" targetFramework="net45" />