Browse Source

Merge branch 'master' into fixes/select-all-unselecting-items

Steven Kirk 6 years ago
parent
commit
f8c4d7aa6a
100 changed files with 725 additions and 78 deletions
  1. 3 0
      .gitmodules
  2. 7 0
      .ncrunch/Avalonia.Animation.UnitTests.net47.v3.ncrunchproject
  3. 7 0
      .ncrunch/Avalonia.Animation.UnitTests.netcoreapp2.0.v3.ncrunchproject
  4. 3 0
      .ncrunch/Avalonia.Animation.v3.ncrunchproject
  5. 7 0
      .ncrunch/Avalonia.Base.UnitTests.net47.v3.ncrunchproject
  6. 7 0
      .ncrunch/Avalonia.Base.UnitTests.netcoreapp2.0.v3.ncrunchproject
  7. 3 0
      .ncrunch/Avalonia.Base.v3.ncrunchproject
  8. 3 0
      .ncrunch/Avalonia.Benchmarks.v3.ncrunchproject
  9. 5 0
      .ncrunch/Avalonia.Build.Tasks.v3.ncrunchproject
  10. 7 0
      .ncrunch/Avalonia.Controls.DataGrid.v3.ncrunchproject
  11. 7 0
      .ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject
  12. 7 0
      .ncrunch/Avalonia.Controls.UnitTests.netcoreapp2.0.v3.ncrunchproject
  13. 3 0
      .ncrunch/Avalonia.Controls.v3.ncrunchproject
  14. 7 0
      .ncrunch/Avalonia.Designer.HostApp.net461.v3.ncrunchproject
  15. 7 0
      .ncrunch/Avalonia.Designer.HostApp.netcoreapp2.0.v3.ncrunchproject
  16. 3 0
      .ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject
  17. 7 0
      .ncrunch/Avalonia.DesktopRuntime.net461.v3.ncrunchproject
  18. 7 0
      .ncrunch/Avalonia.DesktopRuntime.netcoreapp2.0.v3.ncrunchproject
  19. 3 0
      .ncrunch/Avalonia.Diagnostics.v3.ncrunchproject
  20. 3 0
      .ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject
  21. 3 0
      .ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject
  22. 3 0
      .ncrunch/Avalonia.Direct2D1.v3.ncrunchproject
  23. 5 1
      .ncrunch/Avalonia.Gtk3.v3.ncrunchproject
  24. 7 0
      .ncrunch/Avalonia.Input.UnitTests.net47.v3.ncrunchproject
  25. 7 0
      .ncrunch/Avalonia.Input.UnitTests.netcoreapp2.0.v3.ncrunchproject
  26. 3 0
      .ncrunch/Avalonia.Input.v3.ncrunchproject
  27. 3 0
      .ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject
  28. 3 0
      .ncrunch/Avalonia.Interactivity.v3.ncrunchproject
  29. 3 0
      .ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject
  30. 3 0
      .ncrunch/Avalonia.Layout.v3.ncrunchproject
  31. 3 0
      .ncrunch/Avalonia.LeakTests.v3.ncrunchproject
  32. 3 0
      .ncrunch/Avalonia.LinuxFramebuffer.v3.ncrunchproject
  33. 3 0
      .ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject
  34. 7 0
      .ncrunch/Avalonia.Markup.UnitTests.net47.v3.ncrunchproject
  35. 7 0
      .ncrunch/Avalonia.Markup.UnitTests.netcoreapp2.0.v3.ncrunchproject
  36. 7 0
      .ncrunch/Avalonia.Markup.Xaml.UnitTests.net47.v3.ncrunchproject
  37. 7 0
      .ncrunch/Avalonia.Markup.Xaml.UnitTests.netcoreapp2.0.v3.ncrunchproject
  38. 3 0
      .ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject
  39. 3 0
      .ncrunch/Avalonia.Markup.v3.ncrunchproject
  40. 7 0
      .ncrunch/Avalonia.OpenGL.v3.ncrunchproject
  41. 7 0
      .ncrunch/Avalonia.ReactiveUI.UnitTests.v3.ncrunchproject
  42. 3 0
      .ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject
  43. 3 0
      .ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject
  44. 7 0
      .ncrunch/Avalonia.Skia.UnitTests.v3.ncrunchproject
  45. 5 1
      .ncrunch/Avalonia.Skia.v3.ncrunchproject
  46. 7 0
      .ncrunch/Avalonia.Styling.UnitTests.net47.v3.ncrunchproject
  47. 7 0
      .ncrunch/Avalonia.Styling.UnitTests.netcoreapp2.0.v3.ncrunchproject
  48. 3 0
      .ncrunch/Avalonia.Styling.v3.ncrunchproject
  49. 3 0
      .ncrunch/Avalonia.Themes.Default.v3.ncrunchproject
  50. 3 0
      .ncrunch/Avalonia.UnitTests.v3.ncrunchproject
  51. 7 0
      .ncrunch/Avalonia.Visuals.UnitTests.net47.v3.ncrunchproject
  52. 7 0
      .ncrunch/Avalonia.Visuals.UnitTests.netcoreapp2.0.v3.ncrunchproject
  53. 3 0
      .ncrunch/Avalonia.Visuals.v3.ncrunchproject
  54. 3 0
      .ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject
  55. 3 0
      .ncrunch/Avalonia.Win32.v3.ncrunchproject
  56. 7 0
      .ncrunch/Avalonia.X11.v3.ncrunchproject
  57. 8 0
      .ncrunch/Avalonia.netcoreapp2.0.v3.ncrunchproject
  58. 8 0
      .ncrunch/Avalonia.netstandard2.0.v3.ncrunchproject
  59. 3 0
      .ncrunch/Direct3DInteropSample.v3.ncrunchproject
  60. 7 0
      .ncrunch/PlatformSanityChecks.v3.ncrunchproject
  61. 2 2
      azure-pipelines.yml
  62. 2 2
      build/EmbedXaml.props
  63. 5 0
      build/SampleApp.props
  64. 3 3
      build/SharedVersion.props
  65. 3 3
      dirs.proj
  66. 3 6
      native/Avalonia.Native/src/OSX/SystemDialogs.mm
  67. 8 0
      nukebuild/Build.cs
  68. 37 2
      packages/Avalonia/AvaloniaBuildTasks.targets
  69. 8 5
      samples/BindingDemo/App.xaml
  70. 1 0
      samples/BindingDemo/App.xaml.cs
  71. 1 0
      samples/BindingDemo/BindingDemo.csproj
  72. 2 1
      samples/BindingDemo/MainWindow.xaml
  73. 3 1
      samples/BindingDemo/TestItemView.xaml
  74. 2 2
      samples/ControlCatalog.Android/ControlCatalog.Android.csproj
  75. 2 2
      samples/ControlCatalog.Desktop/Program.cs
  76. 1 0
      samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj
  77. 2 2
      samples/ControlCatalog.NetCore/Program.cs
  78. 1 1
      samples/ControlCatalog/App.xaml
  79. 1 0
      samples/ControlCatalog/MainView.xaml
  80. 15 8
      samples/ControlCatalog/MainView.xaml.cs
  81. 11 1
      samples/ControlCatalog/MainWindow.xaml
  82. 15 0
      samples/ControlCatalog/MainWindow.xaml.cs
  83. 0 9
      samples/ControlCatalog/Pages/ButtonPage.xaml.cs
  84. 1 1
      samples/ControlCatalog/Pages/ButtonSpinnerPage.xaml.cs
  85. 10 0
      samples/ControlCatalog/Pages/NotificationsPage.xaml
  86. 18 0
      samples/ControlCatalog/Pages/NotificationsPage.xaml.cs
  87. 4 4
      samples/ControlCatalog/SideBar.xaml
  88. 44 0
      samples/ControlCatalog/ViewModels/MainWindowViewModel.cs
  89. 30 0
      samples/ControlCatalog/ViewModels/NotificationViewModel.cs
  90. 19 0
      samples/ControlCatalog/Views/CustomNotificationView.xaml
  91. 18 0
      samples/ControlCatalog/Views/CustomNotificationView.xaml.cs
  92. 1 3
      samples/RemoteDemo/RemoteDemo.csproj
  93. 9 6
      samples/RenderDemo/App.xaml
  94. 1 0
      samples/RenderDemo/App.xaml.cs
  95. 5 0
      samples/RenderDemo/MainWindow.xaml
  96. 4 3
      samples/RenderDemo/Pages/AnimationsPage.xaml
  97. 9 7
      samples/RenderDemo/Pages/ClippingPage.xaml
  98. 119 0
      samples/RenderDemo/Pages/CustomSkiaPage.cs
  99. 4 2
      samples/RenderDemo/Pages/DrawingPage.xaml
  100. 1 0
      samples/RenderDemo/RenderDemo.csproj

+ 3 - 0
.gitmodules

@@ -4,3 +4,6 @@
 [submodule "nukebuild/Numerge"]
 	path = nukebuild/Numerge
 	url = https://github.com/kekekeks/Numerge.git
+[submodule "src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github"]
+	path = src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github
+	url = https://github.com/kekekeks/XamlIl.git

+ 7 - 0
.ncrunch/Avalonia.Animation.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Animation.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Animation.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Base.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Base.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Base.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 5 - 0
.ncrunch/Avalonia.Build.Tasks.v3.ncrunchproject

@@ -0,0 +1,5 @@
+<ProjectConfiguration>
+  <Settings>
+    <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Controls.DataGrid.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Controls.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Controls.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Designer.HostApp.net461.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Designer.HostApp.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.DesktopRuntime.net461.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.DesktopRuntime.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Diagnostics.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject

@@ -4,6 +4,9 @@
       <Value>..\TestFiles\Direct2D1\**.*</Value>
     </AdditionalFilesToIncludeForProject>
     <DefaultTestTimeout>3000</DefaultTestTimeout>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Direct2D1.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 5 - 1
.ncrunch/Avalonia.Gtk3.v3.ncrunchproject

@@ -1,3 +1,7 @@
 <ProjectConfiguration>
-  <Settings />
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Input.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Input.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Input.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Interactivity.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Layout.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.LeakTests.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.LinuxFramebuffer.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Markup.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Markup.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Markup.Xaml.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Markup.Xaml.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Markup.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.OpenGL.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.ReactiveUI.UnitTests.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject

@@ -4,6 +4,9 @@
       <Value>..\TestFiles\Skia\**.*</Value>
     </AdditionalFilesToIncludeForProject>
     <DefaultTestTimeout>3000</DefaultTestTimeout>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Skia.UnitTests.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 5 - 1
.ncrunch/Avalonia.Skia.v3.ncrunchproject

@@ -1,3 +1,7 @@
 <ProjectConfiguration>
-  <Settings />
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Styling.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Styling.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Styling.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Themes.Default.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.UnitTests.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Visuals.UnitTests.net47.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.Visuals.UnitTests.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Visuals.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 3 - 0
.ncrunch/Avalonia.Win32.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/Avalonia.X11.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 8 - 0
.ncrunch/Avalonia.netcoreapp2.0.v3.ncrunchproject

@@ -0,0 +1,8 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>DerivedFilesIncludedInWorkspace</Value>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 8 - 0
.ncrunch/Avalonia.netstandard2.0.v3.ncrunchproject

@@ -0,0 +1,8 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>DerivedFilesIncludedInWorkspace</Value>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 3 - 0
.ncrunch/Direct3DInteropSample.v3.ncrunchproject

@@ -1,5 +1,8 @@
 <ProjectConfiguration>
   <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
     <PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
   </Settings>
 </ProjectConfiguration>

+ 7 - 0
.ncrunch/PlatformSanityChecks.v3.ncrunchproject

@@ -0,0 +1,7 @@
+<ProjectConfiguration>
+  <Settings>
+    <HiddenComponentWarnings>
+      <Value>MissingOrIgnoredProjectReference</Value>
+    </HiddenComponentWarnings>
+  </Settings>
+</ProjectConfiguration>

+ 2 - 2
azure-pipelines.yml

@@ -32,7 +32,7 @@ jobs:
      
 - job: macOS
   pool:
-    vmImage: 'xcode9-macos10.13'
+    vmImage: 'macOS-10.14'
   steps:
   - task: DotNetCoreInstaller@0
     inputs:
@@ -49,7 +49,7 @@ jobs:
     inputs:
       actions: 'build'
       scheme: ''
-      sdk: 'macosx10.13'
+      sdk: 'macosx10.14'
       configuration: 'Release'
       xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace'
       xcodeVersion: 'default' # Options: 8, 9, default, specifyPath

+ 2 - 2
build/EmbedXaml.props

@@ -4,8 +4,8 @@
      <Compile Update="**\*.xaml.cs">
       <DependentUpon>%(Filename)</DependentUpon>
     </Compile>
-    <EmbeddedResource Include="**\*.xaml">
+    <AvaloniaResource Include="**\*.xaml">
       <SubType>Designer</SubType>
-    </EmbeddedResource>
+    </AvaloniaResource>
   </ItemGroup>
 </Project>

+ 5 - 0
build/SampleApp.props

@@ -5,4 +5,9 @@
   <ItemGroup>
     <ProjectReference Include="$(MSBuildThisFileDirectory)..\src\Avalonia.Desktop\Avalonia.Desktop.csproj" />
   </ItemGroup>
+  <Target Name="GatherReferences" AfterTargets="CoreCompile">
+    <WriteLinesToFile File="$(TargetPath).refs"
+                      Lines="@(ReferencePathWithRefAssemblies)"
+                      Overwrite="true" />
+  </Target>
 </Project>

+ 3 - 3
build/SharedVersion.props

@@ -2,8 +2,8 @@
   xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <Product>Avalonia</Product>
-    <Version>0.7.1</Version>
-    <Copyright>Copyright 2018 &#169; The AvaloniaUI Project</Copyright>
+    <Version>0.8.1</Version>
+    <Copyright>Copyright 2019 &#169; The AvaloniaUI Project</Copyright>
     <PackageLicenseUrl>https://github.com/AvaloniaUI/Avalonia/blob/master/licence.md</PackageLicenseUrl>
     <PackageProjectUrl>https://github.com/AvaloniaUI/Avalonia/</PackageProjectUrl>
     <RepositoryUrl>https://github.com/AvaloniaUI/Avalonia/</RepositoryUrl>
@@ -11,4 +11,4 @@
     <NoWarn>CS1591</NoWarn>
     <LangVersion>latest</LangVersion>
   </PropertyGroup>
-</Project>
+</Project>

+ 3 - 3
dirs.proj

@@ -6,12 +6,12 @@
     <ProjectReference Include="packages/**/*.*proj" />
     <ProjectReference Remove="**/*.shproj" />
     <ProjectReference Remove="src/Markup/Avalonia.Markup.Xaml/PortableXaml/**/*.*proj" />
+    <ProjectReference Remove="src/Markup/Avalonia.Markup.Xaml/XamlIl/**/*.*proj" />
   </ItemGroup>
-  <ItemGroup Condition="!Exists('$(MSBuildExtensionsPath)\Xamarin\Android')">
+<!-- Disabled on CI because of ancient MSBuild project format -->
+  <ItemGroup>
     <ProjectReference Remove="src/Android/**/*.*proj" />
     <ProjectReference Remove="samples/ControlCatalog.Android/ControlCatalog.Android.csproj" />
-  </ItemGroup>
-  <ItemGroup Condition="!Exists('$(MSBuildExtensionsPath)\Xamarin\iOS')">
     <ProjectReference Remove="src/iOS/**/*.*proj" />
     <ProjectReference Remove="samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj" />
   </ItemGroup>

+ 3 - 6
native/Avalonia.Native/src/OSX/SystemDialogs.mm

@@ -45,8 +45,7 @@ public:
                         {
                             auto url = [urls objectAtIndex:i];
                             
-                            auto string = [url absoluteString];
-                            string = [string substringFromIndex:7];
+                            auto string = [url path];
                             
                             strings[i] = (void*)[string UTF8String];
                         }
@@ -137,8 +136,7 @@ public:
                         {
                             auto url = [urls objectAtIndex:i];
                             
-                            auto string = [url absoluteString];
-                            string = [string substringFromIndex:7];
+                            auto string = [url path];
                             
                             strings[i] = (void*)[string UTF8String];
                         }
@@ -220,8 +218,7 @@ public:
                     
                     auto url = [panel URL];
                     
-                    auto string = [url absoluteString];
-                    string = [string substringFromIndex:7];     
+                    auto string = [url path];   
                     strings[0] = (void*)[string UTF8String];
                
                     events->OnCompleted(1, &strings[0]);

+ 8 - 0
nukebuild/Build.cs

@@ -122,6 +122,14 @@ partial class Build : NukeBuild
         
         foreach(var fw in frameworks)
         {
+            if (fw.StartsWith("net4")
+                && RuntimeInformation.IsOSPlatform(OSPlatform.Linux) 
+                && Environment.GetEnvironmentVariable("FORCE_LINUX_TESTS") != "1")
+            {
+                Information($"Skipping {fw} tests on Linux - https://github.com/mono/mono/issues/13969");
+                continue;
+            }
+
             Information("Running for " + fw);
             DotNetTest(c =>
             {

+ 37 - 2
packages/Avalonia/AvaloniaBuildTasks.targets

@@ -8,6 +8,10 @@
              AssemblyFile="$(AvaloniaBuildTasksLocation)"
              />
 
+  <UsingTask TaskName="CompileAvaloniaXamlTask"
+             AssemblyFile="$(AvaloniaBuildTasksLocation)"
+             />
+
 
   <Target Name="AddAvaloniaResources" BeforeTargets="ResolveReferences">
     <PropertyGroup>
@@ -20,11 +24,15 @@
     </ItemGroup>
   </Target>
   
+  <PropertyGroup>
+    <BuildAvaloniaResourcesDependsOn>$(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences</BuildAvaloniaResourcesDependsOn>
+  </PropertyGroup>
+  
   <Target Name="GenerateAvaloniaResources" 
           BeforeTargets="CoreCompile;CoreResGen"
           Inputs="@(AvaloniaResource);$(MSBuildAllProjects)"
           Outputs="$(AvaloniaResourcesTemporaryFilePath)"
-          DependsOnTargets="$(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences">
+          DependsOnTargets="$(BuildAvaloniaResourcesDependsOn)">
     <GenerateAvaloniaResourcesTask
       Condition="'$(_AvaloniaUseExternalMSBuild)' != 'true'"
       Output="$(AvaloniaResourcesTemporaryFilePath)"
@@ -33,9 +41,36 @@
       EmbeddedResources="@(EmbeddedResources)"/>
     <Exec 
       Condition="'$(_AvaloniaUseExternalMSBuild)' == 'true'"
-      Command="dotnet msbuild /nodereuse:false $(MSBuildProjectFile) /t:GenerateAvaloniaResources /p:_AvaloniaForceInternalMSBuild=true /p:Configuration=$(Configuration)"/>
+      Command="dotnet msbuild /nodereuse:false $(MSBuildProjectFile) /t:GenerateAvaloniaResources /p:_AvaloniaForceInternalMSBuild=true /p:Configuration=$(Configuration) /p:TargetFramework=$(TargetFramework) /p:BuildProjectReferences=false"/>
 
   </Target>
+
+  <Target
+    Name="CompileAvaloniaXaml"
+    AfterTargets="AfterCompile"
+    Condition="Exists('@(IntermediateAssembly)') And $(DesignTimeBuild) != true And $(EnableAvaloniaXamlCompilation) != false"
+    >
+    <PropertyGroup>
+      <AvaloniaXamlReferencesTemporaryFilePath Condition="'$(AvaloniaXamlReferencesTemporaryFilePath)' == ''">$(IntermediateOutputPath)/Avalonia/references</AvaloniaXamlReferencesTemporaryFilePath>
+      <AvaloniaXamlOriginalCopyFilePath Condition="'$(AvaloniaXamlOriginalCopyFilePath)' == ''">$(IntermediateOutputPath)/Avalonia/original.dll</AvaloniaXamlOriginalCopyFilePath>
+    </PropertyGroup>
+    <WriteLinesToFile
+      Condition="'$(_AvaloniaForceInternalMSBuild)' != 'true'"
+      File="$(AvaloniaXamlReferencesTemporaryFilePath)"
+      Lines="@(ReferencePathWithRefAssemblies)"
+      Overwrite="true" />
+    <CompileAvaloniaXamlTask
+      Condition="'$(_AvaloniaUseExternalMSBuild)' != 'true'"
+      AssemblyFile="@(IntermediateAssembly)"
+      ReferencesFilePath="$(AvaloniaXamlReferencesTemporaryFilePath)"
+      OriginalCopyPath="$(AvaloniaXamlOriginalCopyFilePath)"
+      ProjectDirectory="$(MSBuildProjectDirectory)"
+    />
+    <Exec
+      Condition="'$(_AvaloniaUseExternalMSBuild)' == 'true'"
+      Command="dotnet msbuild /nodereuse:false $(MSBuildProjectFile) /t:CompileAvaloniaXaml /p:_AvaloniaForceInternalMSBuild=true /p:Configuration=$(Configuration) /p:TargetFramework=$(TargetFramework) /p:BuildProjectReferences=false"/>
+  </Target>
+
   
   <ItemGroup>
     <UpToDateCheckInput Include="@(AvaloniaResource)" />

+ 8 - 5
samples/BindingDemo/App.xaml

@@ -1,6 +1,9 @@
-<Application xmlns="https://github.com/avaloniaui">
-  <Application.Styles>
-    <StyleInclude Source="resm:Avalonia.Themes.Default.DefaultTheme.xaml?assembly=Avalonia.Themes.Default"/>
-    <StyleInclude Source="resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default"/>
-  </Application.Styles>
+<Application
+    xmlns="https://github.com/avaloniaui" 
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    x:Class="BindingDemo.App">
+    <Application.Styles>
+        <StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/>
+        <StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/>
+    </Application.Styles>
 </Application>

+ 1 - 0
samples/BindingDemo/App.xaml.cs

@@ -3,6 +3,7 @@ using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Logging.Serilog;
 using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
 using Serilog;
 
 namespace BindingDemo

+ 1 - 0
samples/BindingDemo/BindingDemo.csproj

@@ -14,4 +14,5 @@
   <Import Project="..\..\build\ReactiveUI.props" />
   <Import Condition="'$(TargetFramework)'=='net461'" Project="..\..\build\NetFX.props" />
   <Import Project="..\..\build\ReferenceCoreLibraries.props" />
+  <Import Project="..\..\build\BuildTargets.targets" />
 </Project>

+ 2 - 1
samples/BindingDemo/MainWindow.xaml

@@ -1,6 +1,7 @@
 <Window xmlns="https://github.com/avaloniaui"
         xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
-        xmlns:vm="clr-namespace:BindingDemo.ViewModels"
+        x:Class="BindingDemo.MainWindow"
+        xmlns:vm="clr-namespace:BindingDemo.ViewModels" 
         xmlns:local="clr-namespace:BindingDemo"
         Title="AvaloniaUI Bindings Test"
         Width="800"

+ 3 - 1
samples/BindingDemo/TestItemView.xaml

@@ -1,4 +1,6 @@
-<UserControl xmlns="https://github.com/avaloniaui">
+<UserControl xmlns="https://github.com/avaloniaui"
+        xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
+        x:Class="BindingDemo.TestItemView">
   <StackPanel>
     <TextBlock Classes="h1" Text="{Binding StringValue}"/>
     <TextBox Text="{Binding Detail}" AcceptsReturn="True"/>

+ 2 - 2
samples/ControlCatalog.Android/ControlCatalog.Android.csproj

@@ -32,7 +32,7 @@
     <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
     <BundleAssemblies>False</BundleAssemblies>
     <AndroidCreatePackagePerAbi>False</AndroidCreatePackagePerAbi>
-    <AndroidSupportedAbis>armeabi;armeabi-v7a;x86</AndroidSupportedAbis>
+    <AndroidSupportedAbis>armeabi-v7a;x86</AndroidSupportedAbis>
     <Debugger>Xamarin</Debugger>
     <AndroidEnableMultiDex>False</AndroidEnableMultiDex>
     <AotAssemblies>False</AotAssemblies>
@@ -51,7 +51,7 @@
     <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
     <BundleAssemblies>False</BundleAssemblies>
     <AndroidCreatePackagePerAbi>False</AndroidCreatePackagePerAbi>
-    <AndroidSupportedAbis>armeabi,armeabi-v7a,x86</AndroidSupportedAbis>
+    <AndroidSupportedAbis>armeabi-v7a,x86</AndroidSupportedAbis>
     <Debugger>Xamarin</Debugger>
     <AotAssemblies>False</AotAssemblies>
     <EnableLLVM>False</EnableLLVM>

+ 2 - 2
samples/ControlCatalog.Desktop/Program.cs

@@ -4,6 +4,7 @@ using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Logging.Serilog;
 using Avalonia.Platform;
+using Avalonia.ReactiveUI;
 using Serilog;
 
 namespace ControlCatalog
@@ -25,8 +26,7 @@ namespace ControlCatalog
             => AppBuilder.Configure<App>()
                 .LogToDebug()
                 .UsePlatformDetect()
-                .UseReactiveUI()
-                .UseDataGrid();
+                .UseReactiveUI();
 
         private static void ConfigureAssetAssembly(AppBuilder builder)
         {

+ 1 - 0
samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj

@@ -3,6 +3,7 @@
   <PropertyGroup>
     <OutputType>Exe</OutputType>
     <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
samples/ControlCatalog.NetCore/Program.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Threading;
 using Avalonia;
 using Avalonia.Skia;
+using Avalonia.ReactiveUI;
 
 namespace ControlCatalog.NetCore
 {
@@ -46,8 +47,7 @@ namespace ControlCatalog.NetCore
             => AppBuilder.Configure<App>()
                 .UsePlatformDetect()
                 .UseSkia()
-                .UseReactiveUI()
-                .UseDataGrid();
+                .UseReactiveUI();
 
         static void ConsoleSilencer()
         {

+ 1 - 1
samples/ControlCatalog/App.xaml

@@ -4,7 +4,7 @@
   <Application.Styles>
       <StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/>
       <StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/>
-      <StyleInclude Source="resm:Avalonia.Controls.DataGrid.Themes.Default.xaml?assembly=Avalonia.Controls.DataGrid"/>
+      <StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Default.xaml"/>
     <Style Selector="TextBlock.h1">
       <Setter Property="FontSize" Value="{DynamicResource FontSizeLarge}"/>
       <Setter Property="FontWeight" Value="Medium"/>

+ 1 - 0
samples/ControlCatalog/MainView.xaml

@@ -29,6 +29,7 @@
       <TabItem Header="LayoutTransformControl"><pages:LayoutTransformControlPage/></TabItem>
       <TabItem Header="ListBox"><pages:ListBoxPage/></TabItem>
       <TabItem Header="Menu"><pages:MenuPage/></TabItem>
+      <TabItem Header="Notifications"><pages:NotificationsPage/></TabItem>
 	  <TabItem Header="NumericUpDown"><pages:NumericUpDownPage/></TabItem>
       <TabItem Header="ProgressBar"><pages:ProgressBarPage/></TabItem>
       <TabItem Header="RadioButton"><pages:RadioButtonPage/></TabItem>

+ 15 - 8
samples/ControlCatalog/MainView.xaml.cs

@@ -1,8 +1,11 @@
+using System;
 using System.Collections;
 using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Markup.Xaml;
+using Avalonia.Markup.Xaml.MarkupExtensions;
 using Avalonia.Markup.Xaml.Styling;
+using Avalonia.Markup.Xaml.XamlIl;
 using Avalonia.Platform;
 using ControlCatalog.Pages;
 
@@ -12,7 +15,7 @@ namespace ControlCatalog
     {
         public MainView()
         {
-            this.InitializeComponent();
+            AvaloniaXamlLoader.Load(this);
             if (AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetRuntimeInfo().IsDesktop)
             {
                 IList tabItems = ((IList)this.FindControl<TabControl>("Sidebar").Items);
@@ -28,8 +31,17 @@ namespace ControlCatalog
                 });
 
             }
-            var light = AvaloniaXamlLoader.Parse<StyleInclude>(@"<StyleInclude xmlns='https://github.com/avaloniaui' Source='resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default'/>");
-            var dark = AvaloniaXamlLoader.Parse<StyleInclude>(@"<StyleInclude xmlns='https://github.com/avaloniaui' Source='resm:Avalonia.Themes.Default.Accents.BaseDark.xaml?assembly=Avalonia.Themes.Default'/>");
+
+            var light = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
+            {
+                Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default")
+            };
+            var dark = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog"))
+            {
+                Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseDark.xaml?assembly=Avalonia.Themes.Default")
+            };
+
+            
             var themes = this.Find<ComboBox>("Themes");
             themes.SelectionChanged += (sender, e) =>
             {
@@ -45,10 +57,5 @@ namespace ControlCatalog
             };
             Styles.Add(light);
         }
-
-        private void InitializeComponent()
-        {
-            AvaloniaXamlLoader.Load(this);
-        }
     }
 }

+ 11 - 1
samples/ControlCatalog/MainWindow.xaml

@@ -1,8 +1,18 @@
 <Window xmlns="https://github.com/avaloniaui" MinWidth="500" MinHeight="300"
+        xmlns:pages="clr-namespace:ControlCatalog.Pages"
         Title="Avalonia Control Gallery"
         Icon="/Assets/test_icon.ico"
         xmlns:local="clr-namespace:ControlCatalog"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:vm="clr-namespace:ControlCatalog.ViewModels"
+        xmlns:v="clr-namespace:ControlCatalog.Views"
         x:Class="ControlCatalog.MainWindow">
-    <local:MainView/>
+    <Window.DataTemplates>
+        <DataTemplate DataType="vm:NotificationViewModel">
+            <v:CustomNotificationView />
+        </DataTemplate>
+    </Window.DataTemplates>
+    <Panel>
+        <local:MainView/>
+    </Panel>
 </Window>

+ 15 - 0
samples/ControlCatalog/MainWindow.xaml.cs

@@ -1,18 +1,33 @@
 using Avalonia;
 using Avalonia.Controls;
+using Avalonia.Controls.Notifications;
+using Avalonia.Controls.Primitives;
 using Avalonia.Markup.Xaml;
+using Avalonia.Threading;
+using ControlCatalog.ViewModels;
 using System;
+using System.Threading.Tasks;
 
 namespace ControlCatalog
 {
     public class MainWindow : Window
     {
+        private WindowNotificationManager _notificationArea;
+
         public MainWindow()
         {
             this.InitializeComponent();
             this.AttachDevTools();
             //Renderer.DrawFps = true;
             //Renderer.DrawDirtyRects = Renderer.DrawFps = true;
+
+            _notificationArea = new WindowNotificationManager(this)
+            {
+                Position = NotificationPosition.TopRight,
+                MaxItems = 3
+            };
+
+            DataContext = new MainWindowViewModel(_notificationArea);
         }
 
         private void InitializeComponent()

+ 0 - 9
samples/ControlCatalog/Pages/ButtonPage.xaml.cs

@@ -5,14 +5,5 @@ namespace ControlCatalog.Pages
 {
     public class ButtonPage : UserControl
     {
-        public ButtonPage()
-        {
-            this.InitializeComponent();
-        }
-
-        private void InitializeComponent()
-        {
-            AvaloniaXamlLoader.Load(this);
-        }
     }
 }

+ 1 - 1
samples/ControlCatalog/Pages/ButtonSpinnerPage.xaml.cs

@@ -18,7 +18,7 @@ namespace ControlCatalog.Pages
             AvaloniaXamlLoader.Load(this);
         }
 
-        private void OnSpin(object sender, SpinEventArgs e)
+        public void OnSpin(object sender, SpinEventArgs e)
         {
             var spinner = (ButtonSpinner)sender;
             var txtBox = (TextBlock)spinner.Content;

+ 10 - 0
samples/ControlCatalog/Pages/NotificationsPage.xaml

@@ -0,0 +1,10 @@
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             x:Class="ControlCatalog.Pages.NotificationsPage">
+  <StackPanel Orientation="Vertical" Spacing="4" HorizontalAlignment="Left">
+        <TextBlock Classes="h1">Notifications</TextBlock>
+        <Button Content="Show Standard Managed Notification" Command="{Binding ShowManagedNotificationCommand}" />
+        <Button Content="Show Custom Managed Notification" Command="{Binding ShowCustomManagedNotificationCommand}" />
+        <Button Content="Show Native Notification" Command="{Binding ShowNativeNotificationCommand}" />
+    </StackPanel>
+</UserControl>

+ 18 - 0
samples/ControlCatalog/Pages/NotificationsPage.xaml.cs

@@ -0,0 +1,18 @@
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace ControlCatalog.Pages
+{
+    public class NotificationsPage : UserControl
+    {
+        public NotificationsPage()
+        {
+            this.InitializeComponent();
+        }
+
+        private void InitializeComponent()
+        {
+            AvaloniaXamlLoader.Load(this);
+        }
+    }
+}

+ 4 - 4
samples/ControlCatalog/SideBar.xaml

@@ -1,6 +1,6 @@
 <Styles xmlns="https://github.com/avaloniaui"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-        x:Class="ControlCatalog.SideBar">
+>
     <Design.PreviewWith>
         <Border Padding="20">
             <TabControl Classes="sidebar">
@@ -56,20 +56,20 @@
         <Setter Property="Opacity" Value="0.5"/>
         <Setter Property="Transitions">
             <Transitions>
-                <DoubleTransition Property="Opacity" Duration="0:0:0.5"/>
+                <DoubleTransition Property="Opacity" Duration="0:0:0.150"/>
             </Transitions>
         </Setter>
     </Style>
     <Style Selector="TabControl.sidebar > TabItem:pointerover">
         <Setter Property="Opacity" Value="1"/>
     </Style>
-    <Style Selector="TabControl.sidebar > TabItem:pointerover /template/ ContentPresenter#PART_ContentPresenter">
+    <Style Selector="TabControl.sidebar > TabItem:pointerover">
         <Setter Property="Background" Value="Transparent"/>
     </Style>
     <Style Selector="TabControl.sidebar > TabItem:selected">
         <Setter Property="Opacity" Value="1"/>
     </Style>
-    <Style Selector="TabControl.sidebar > TabItem:selected /template/ ContentPresenter#PART_ContentPresenter">
+    <Style Selector="TabControl.sidebar > TabItem:selected">
         <Setter Property="Background" Value="{DynamicResource ThemeAccentBrush2}"/>
     </Style>
 </Styles>

+ 44 - 0
samples/ControlCatalog/ViewModels/MainWindowViewModel.cs

@@ -0,0 +1,44 @@
+using System.Reactive;
+using Avalonia.Controls.Notifications;
+using Avalonia.Diagnostics.ViewModels;
+using ReactiveUI;
+
+namespace ControlCatalog.ViewModels
+{
+    class MainWindowViewModel : ViewModelBase
+    {
+        private IManagedNotificationManager _notificationManager;
+
+        public MainWindowViewModel(IManagedNotificationManager notificationManager)
+        {
+            _notificationManager = notificationManager;
+
+            ShowCustomManagedNotificationCommand = ReactiveCommand.Create(() =>
+            {
+                NotificationManager.Show(new NotificationViewModel(NotificationManager) { Title = "Hey There!", Message = "Did you know that Avalonia now supports Custom In-Window Notifications?" });
+            });
+
+            ShowManagedNotificationCommand = ReactiveCommand.Create(() =>
+            {
+                NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Welcome", "Avalonia now supports Notifications.", NotificationType.Information));
+            });
+
+            ShowNativeNotificationCommand = ReactiveCommand.Create(() =>
+            {
+                NotificationManager.Show(new Avalonia.Controls.Notifications.Notification("Error", "Native Notifications are not quite ready. Coming soon.", NotificationType.Error));
+            });
+        }
+
+        public IManagedNotificationManager NotificationManager
+        {
+            get { return _notificationManager; }
+            set { this.RaiseAndSetIfChanged(ref _notificationManager, value); }
+        }
+
+        public ReactiveCommand<Unit, Unit> ShowCustomManagedNotificationCommand { get; }
+
+        public ReactiveCommand<Unit, Unit> ShowManagedNotificationCommand { get; }
+
+        public ReactiveCommand<Unit, Unit> ShowNativeNotificationCommand { get; }
+    }
+}

+ 30 - 0
samples/ControlCatalog/ViewModels/NotificationViewModel.cs

@@ -0,0 +1,30 @@
+using System.Reactive;
+using Avalonia.Controls.Notifications;
+using ReactiveUI;
+
+namespace ControlCatalog.ViewModels
+{
+    public class NotificationViewModel
+    {
+        public NotificationViewModel(INotificationManager manager)
+        {
+            YesCommand = ReactiveCommand.Create(() =>
+            {
+                manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today."));
+            });
+
+            NoCommand = ReactiveCommand.Create(() =>
+            {
+                manager.Show(new Avalonia.Controls.Notifications.Notification("Avalonia Notifications", "Start adding notifications to your app today. To find out more visit..."));
+            });
+        }
+
+        public string Title { get; set; }
+        public string Message { get; set; }
+
+        public ReactiveCommand<Unit, Unit> YesCommand { get; }
+
+        public ReactiveCommand<Unit, Unit> NoCommand { get; }
+
+    }
+}

+ 19 - 0
samples/ControlCatalog/Views/CustomNotificationView.xaml

@@ -0,0 +1,19 @@
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             x:Class="ControlCatalog.Views.CustomNotificationView">
+    <Border Padding="12" MinHeight="20" Background="DodgerBlue">
+        <Grid ColumnDefinitions="Auto,*">
+            <Panel Margin="0,0,12,0" Width="25" Height="25" VerticalAlignment="Top">
+                <TextBlock Text="&#xE115;" FontFamily="Segoe UI Symbol" FontSize="20" TextAlignment="Center" VerticalAlignment="Center"/>
+            </Panel>
+            <DockPanel Grid.Column="1">
+                <TextBlock DockPanel.Dock="Top" Text="{Binding Title}" FontWeight="Medium" />
+                <StackPanel Spacing="20" DockPanel.Dock="Bottom" Margin="0,8,0,0" Orientation="Horizontal">
+                    <Button Content="No" DockPanel.Dock="Right" NotificationCard.CloseOnClick="True" Command="{Binding NoCommand}"  Margin="0,0,8,0" />
+                    <Button Content="Yes" DockPanel.Dock="Right" NotificationCard.CloseOnClick="True" Command="{Binding YesCommand}" />
+                </StackPanel>
+                <TextBlock Text="{Binding Message}" TextWrapping="Wrap" Opacity=".8" Margin="0,8,0,0"/>
+            </DockPanel>
+        </Grid>
+    </Border>
+</UserControl>

+ 18 - 0
samples/ControlCatalog/Views/CustomNotificationView.xaml.cs

@@ -0,0 +1,18 @@
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace ControlCatalog.Views
+{
+    public class CustomNotificationView : UserControl
+    {
+        public CustomNotificationView()
+        {
+            this.InitializeComponent();
+        }
+
+        private void InitializeComponent()
+        {
+            AvaloniaXamlLoader.Load(this);
+        }
+    }
+}

+ 1 - 3
samples/RemoteDemo/RemoteDemo.csproj

@@ -1,14 +1,12 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
   <PropertyGroup>
     <OutputType>Exe</OutputType>
     <TargetFramework>netcoreapp2.0</TargetFramework>
   </PropertyGroup>
-
   <ItemGroup>
     <ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
   </ItemGroup>
   <Import Project="..\..\build\SampleApp.props" />
   <Import Project="..\..\build\ReferenceCoreLibraries.props" />
-
+  <Import Project="..\..\build\BuildTargets.targets" />
 </Project>

+ 9 - 6
samples/RenderDemo/App.xaml

@@ -1,7 +1,10 @@
-<Application xmlns="https://github.com/avaloniaui">
-  <Application.Styles>
-    <StyleInclude Source="resm:Avalonia.Themes.Default.DefaultTheme.xaml?assembly=Avalonia.Themes.Default"/>
-    <StyleInclude Source="resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default"/>
-    <StyleInclude Source="resm:RenderDemo.SideBar.xaml"/>
-  </Application.Styles>
+<Application
+    xmlns="https://github.com/avaloniaui" 
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    x:Class="RenderDemo.App">
+    <Application.Styles>
+        <StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/>
+        <StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/>
+        <StyleInclude Source="avares://RenderDemo/SideBar.xaml"/>
+    </Application.Styles>
 </Application>

+ 1 - 0
samples/RenderDemo/App.xaml.cs

@@ -4,6 +4,7 @@
 using Avalonia;
 using Avalonia.Logging.Serilog;
 using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
 
 namespace RenderDemo
 {

+ 5 - 0
samples/RenderDemo/MainWindow.xaml

@@ -1,4 +1,6 @@
 <Window xmlns="https://github.com/avaloniaui"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        x:Class="RenderDemo.MainWindow"
         Title="AvaloniaUI Rendering Test"
         xmlns:pages="clr-namespace:RenderDemo.Pages"
         Width="800"
@@ -33,6 +35,9 @@
       <TabItem Header="Drawing">
         <pages:DrawingPage/>
       </TabItem>
+      <TabItem Header="SkCanvas">
+        <pages:CustomSkiaPage/>
+      </TabItem>
     </TabControl>
   </DockPanel>
 </Window>

+ 4 - 3
samples/RenderDemo/Pages/AnimationsPage.xaml

@@ -1,6 +1,7 @@
-<UserControl
-xmlns="https://github.com/avaloniaui"
-xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+<UserControl 
+  xmlns="https://github.com/avaloniaui" 
+  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
+  x:Class="RenderDemo.Pages.AnimationsPage">
   <UserControl.Styles>
     <Styles>
       <Styles.Resources>

+ 9 - 7
samples/RenderDemo/Pages/ClippingPage.xaml

@@ -1,9 +1,11 @@
-<UserControl
-xmlns="https://github.com/avaloniaui">
+<UserControl 
+  xmlns="https://github.com/avaloniaui" 
+  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
+  x:Class="RenderDemo.Pages.ClippingPage">
   <Grid ColumnDefinitions="Auto" RowDefinitions="Auto,Auto">
     <Grid.Styles>
       <Styles>
-        <Style Selector="Border#clipped :pointerover">
+        <Style Selector="Border#clipped:pointerover">
           <Setter Property="Border.Background" Value="Crimson"/>
         </Style>
         <Style Selector="Border#clipChild">
@@ -17,10 +19,10 @@ xmlns="https://github.com/avaloniaui">
         </Style>
       </Styles>
     </Grid.Styles>
-    <Border Name="clipped"
-            Background="Yellow"
-            Width="100"
-            Height="100"
+    <Border Name="clipped" 
+            Background="Yellow" 
+            Width="100" 
+            Height="100" 
             Clip="M 58.625 0.07421875
                   C 50.305778 0.26687364 42.411858 7.0346526 41.806641 15.595703
                   C 42.446442 22.063923 39.707425 13.710754 36.982422 12.683594

+ 119 - 0
samples/RenderDemo/Pages/CustomSkiaPage.cs

@@ -0,0 +1,119 @@
+using System;
+using System.Diagnostics;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Media;
+using Avalonia.Platform;
+using Avalonia.Rendering.SceneGraph;
+using Avalonia.Skia;
+using Avalonia.Threading;
+using SkiaSharp;
+
+namespace RenderDemo.Pages
+{
+    public class CustomSkiaPage : Control
+    {
+        public CustomSkiaPage()
+        {
+            ClipToBounds = true;
+        }
+        
+        class CustomDrawOp : ICustomDrawOperation
+        {
+            private readonly FormattedText _noSkia;
+
+            public CustomDrawOp(Rect bounds, FormattedText noSkia)
+            {
+                _noSkia = noSkia;
+                Bounds = bounds;
+            }
+            
+            public void Dispose()
+            {
+                // No-op
+            }
+
+            public Rect Bounds { get; }
+            public bool HitTest(Point p) => false;
+            public bool Equals(ICustomDrawOperation other) => false;
+            static Stopwatch St = Stopwatch.StartNew();
+            public void Render(IDrawingContextImpl context)
+            {
+                var canvas = (context as ISkiaDrawingContextImpl)?.SkCanvas;
+                if (canvas == null)
+                    context.DrawText(Brushes.Black, new Point(), _noSkia.PlatformImpl);
+                else
+                {
+                    canvas.Save();
+                    // create the first shader
+                    var colors = new SKColor[] {
+                        new SKColor(0, 255, 255),
+                        new SKColor(255, 0, 255),
+                        new SKColor(255, 255, 0),
+                        new SKColor(0, 255, 255)
+                    };
+
+                    var sx = Animate(100, 2, 10);
+                    var sy = Animate(1000, 5, 15);
+                    var lightPosition = new SKPoint(
+                        (float)(Bounds.Width / 2 + Math.Cos(St.Elapsed.TotalSeconds) * Bounds.Width / 4),
+                        (float)(Bounds.Height / 2 + Math.Sin(St.Elapsed.TotalSeconds) * Bounds.Height / 4));
+                    using (var sweep =
+                        SKShader.CreateSweepGradient(new SKPoint((int)Bounds.Width / 2, (int)Bounds.Height / 2), colors,
+                            null)) 
+                    using(var turbulence = SKShader.CreatePerlinNoiseFractalNoise(0.05f, 0.05f, 4, 0))
+                    using(var shader = SKShader.CreateCompose(sweep, turbulence, SKBlendMode.SrcATop))
+                    using(var blur = SKImageFilter.CreateBlur(Animate(100, 2, 10), Animate(100, 5, 15)))
+                    using (var paint = new SKPaint
+                    {
+                        Shader = shader,
+                        ImageFilter = blur
+                    })
+                        canvas.DrawPaint(paint);
+                    
+                    using (var pseudoLight = SKShader.CreateRadialGradient(
+                        lightPosition,
+                        (float) (Bounds.Width/3),
+                        new [] { 
+                            new SKColor(255, 200, 200, 100), 
+                            SKColors.Transparent,
+                            new SKColor(40,40,40, 220), 
+                            new SKColor(20,20,20, (byte)Animate(100, 200,220)) },
+                        new float[] { 0.3f, 0.3f, 0.8f, 1 },
+                        SKShaderTileMode.Clamp))
+                    using (var paint = new SKPaint
+                    {
+                        Shader = pseudoLight
+                    })
+                        canvas.DrawPaint(paint);
+                    canvas.Restore();
+                }
+            }    
+            static int Animate(int d, int from, int to)
+            {
+                var ms = (int)(St.ElapsedMilliseconds / d);
+                var diff = to - from;
+                var range = diff * 2;
+                var v = ms % range;
+                if (v > diff)
+                    v = range - v;
+                var rv = v + from;
+                if (rv < from || rv > to)
+                    throw new Exception("WTF");
+                return rv;
+            }
+        }
+
+
+        
+        public override void Render(DrawingContext context)
+        {
+            var noSkia = new FormattedText()
+            {
+                Text = "Current rendering API is not Skia"
+            };
+            context.Custom(new CustomDrawOp(new Rect(0, 0, Bounds.Width, Bounds.Height), noSkia));
+            Dispatcher.UIThread.InvokeAsync(InvalidateVisual, DispatcherPriority.Background);
+        }
+    }
+}

+ 4 - 2
samples/RenderDemo/Pages/DrawingPage.xaml

@@ -1,5 +1,7 @@
-<UserControl xmlns="https://github.com/avaloniaui"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+<UserControl 
+    xmlns="https://github.com/avaloniaui" 
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    x:Class="RenderDemo.Pages.DrawingPage">
     <UserControl.Styles>
         <Style>
             <Style.Resources>

+ 1 - 0
samples/RenderDemo/RenderDemo.csproj

@@ -14,4 +14,5 @@
   <Import Project="..\..\build\ReactiveUI.props" />
   <Import Condition="'$(TargetFramework)'=='net461'" Project="..\..\build\NetFX.props" />
   <Import Project="..\..\build\ReferenceCoreLibraries.props" />
+  <Import Project="..\..\build\BuildTargets.targets" />
 </Project>

Some files were not shown because too many files changed in this diff