Browse Source

Merge branch 'master' into fixes/2512-xaml-namescope-registration

pull/2515/head
Steven Kirk 7 years ago
parent
commit
848f50b523
  1. 7
      .ncrunch/Avalonia.Animation.UnitTests.net47.v3.ncrunchproject
  2. 7
      .ncrunch/Avalonia.Animation.UnitTests.netcoreapp2.0.v3.ncrunchproject
  3. 3
      .ncrunch/Avalonia.Animation.v3.ncrunchproject
  4. 7
      .ncrunch/Avalonia.Base.UnitTests.net47.v3.ncrunchproject
  5. 7
      .ncrunch/Avalonia.Base.UnitTests.netcoreapp2.0.v3.ncrunchproject
  6. 3
      .ncrunch/Avalonia.Base.v3.ncrunchproject
  7. 3
      .ncrunch/Avalonia.Benchmarks.v3.ncrunchproject
  8. 5
      .ncrunch/Avalonia.Build.Tasks.v3.ncrunchproject
  9. 7
      .ncrunch/Avalonia.Controls.DataGrid.v3.ncrunchproject
  10. 7
      .ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject
  11. 7
      .ncrunch/Avalonia.Controls.UnitTests.netcoreapp2.0.v3.ncrunchproject
  12. 3
      .ncrunch/Avalonia.Controls.v3.ncrunchproject
  13. 7
      .ncrunch/Avalonia.Designer.HostApp.net461.v3.ncrunchproject
  14. 7
      .ncrunch/Avalonia.Designer.HostApp.netcoreapp2.0.v3.ncrunchproject
  15. 3
      .ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject
  16. 7
      .ncrunch/Avalonia.DesktopRuntime.net461.v3.ncrunchproject
  17. 7
      .ncrunch/Avalonia.DesktopRuntime.netcoreapp2.0.v3.ncrunchproject
  18. 3
      .ncrunch/Avalonia.Diagnostics.v3.ncrunchproject
  19. 3
      .ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject
  20. 3
      .ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject
  21. 3
      .ncrunch/Avalonia.Direct2D1.v3.ncrunchproject
  22. 6
      .ncrunch/Avalonia.Gtk3.v3.ncrunchproject
  23. 7
      .ncrunch/Avalonia.Input.UnitTests.net47.v3.ncrunchproject
  24. 7
      .ncrunch/Avalonia.Input.UnitTests.netcoreapp2.0.v3.ncrunchproject
  25. 3
      .ncrunch/Avalonia.Input.v3.ncrunchproject
  26. 3
      .ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject
  27. 3
      .ncrunch/Avalonia.Interactivity.v3.ncrunchproject
  28. 3
      .ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject
  29. 3
      .ncrunch/Avalonia.Layout.v3.ncrunchproject
  30. 3
      .ncrunch/Avalonia.LeakTests.v3.ncrunchproject
  31. 3
      .ncrunch/Avalonia.LinuxFramebuffer.v3.ncrunchproject
  32. 3
      .ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject
  33. 7
      .ncrunch/Avalonia.Markup.UnitTests.net47.v3.ncrunchproject
  34. 7
      .ncrunch/Avalonia.Markup.UnitTests.netcoreapp2.0.v3.ncrunchproject
  35. 7
      .ncrunch/Avalonia.Markup.Xaml.UnitTests.net47.v3.ncrunchproject
  36. 7
      .ncrunch/Avalonia.Markup.Xaml.UnitTests.netcoreapp2.0.v3.ncrunchproject
  37. 3
      .ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject
  38. 3
      .ncrunch/Avalonia.Markup.v3.ncrunchproject
  39. 7
      .ncrunch/Avalonia.OpenGL.v3.ncrunchproject
  40. 7
      .ncrunch/Avalonia.ReactiveUI.UnitTests.v3.ncrunchproject
  41. 3
      .ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject
  42. 3
      .ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject
  43. 7
      .ncrunch/Avalonia.Skia.UnitTests.v3.ncrunchproject
  44. 6
      .ncrunch/Avalonia.Skia.v3.ncrunchproject
  45. 7
      .ncrunch/Avalonia.Styling.UnitTests.net47.v3.ncrunchproject
  46. 7
      .ncrunch/Avalonia.Styling.UnitTests.netcoreapp2.0.v3.ncrunchproject
  47. 3
      .ncrunch/Avalonia.Styling.v3.ncrunchproject
  48. 3
      .ncrunch/Avalonia.Themes.Default.v3.ncrunchproject
  49. 3
      .ncrunch/Avalonia.UnitTests.v3.ncrunchproject
  50. 7
      .ncrunch/Avalonia.Visuals.UnitTests.net47.v3.ncrunchproject
  51. 7
      .ncrunch/Avalonia.Visuals.UnitTests.netcoreapp2.0.v3.ncrunchproject
  52. 3
      .ncrunch/Avalonia.Visuals.v3.ncrunchproject
  53. 3
      .ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject
  54. 3
      .ncrunch/Avalonia.Win32.v3.ncrunchproject
  55. 7
      .ncrunch/Avalonia.X11.v3.ncrunchproject
  56. 8
      .ncrunch/Avalonia.netcoreapp2.0.v3.ncrunchproject
  57. 8
      .ncrunch/Avalonia.netstandard2.0.v3.ncrunchproject
  58. 3
      .ncrunch/Direct3DInteropSample.v3.ncrunchproject
  59. 7
      .ncrunch/PlatformSanityChecks.v3.ncrunchproject
  60. 3
      samples/ControlCatalog.Desktop/Program.cs
  61. 3
      samples/ControlCatalog.NetCore/Program.cs
  62. 2
      samples/ControlCatalog/SideBar.xaml
  63. 2
      samples/RenderDemo/SideBar.xaml
  64. 2
      samples/interop/WindowsInteropTest/Program.cs
  65. 29
      src/Avalonia.Animation/Animatable.cs
  66. 5
      src/Avalonia.Animation/Properties/AssemblyInfo.cs
  67. 11
      src/Avalonia.Animation/TransitionInstance.cs
  68. 20
      src/Avalonia.Controls.DataGrid/AppBuilderExtensions.cs
  69. 17
      src/Avalonia.Controls/AppBuilderBase.cs
  70. 203
      src/Avalonia.Controls/Application.cs
  71. 18
      src/Avalonia.Controls/ExitEventArgs.cs
  72. 12
      src/Avalonia.Controls/IApplicationLifecycle.cs
  73. 16
      src/Avalonia.Controls/ShutdownMode.cs
  74. 36
      src/Avalonia.Controls/StartupEventArgs.cs
  75. 4
      src/Avalonia.Controls/TopLevel.cs
  76. 4
      src/Avalonia.Controls/Window.cs
  77. 12
      src/Avalonia.Controls/WindowCollection.cs
  78. 73
      tests/Avalonia.Animation.UnitTests/TransitionsTests.cs
  79. 48
      tests/Avalonia.Controls.UnitTests/ApplicationTests.cs
  80. 2
      tests/Avalonia.Controls.UnitTests/TopLevelTests.cs
  81. 60
      tests/Avalonia.LeakTests/TransitionTests.cs
  82. 10
      tests/Avalonia.UnitTests/MockGlobalClock.cs
  83. 6
      tests/Avalonia.UnitTests/TestServices.cs
  84. 2
      tests/Avalonia.UnitTests/UnitTestApplication.cs

7
.ncrunch/Avalonia.Animation.UnitTests.net47.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Animation.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Base.UnitTests.net47.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Base.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject

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

5
.ncrunch/Avalonia.Build.Tasks.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Controls.DataGrid.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Controls.UnitTests.net47.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Controls.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Designer.HostApp.net461.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject

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

7
.ncrunch/Avalonia.DesktopRuntime.net461.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Diagnostics.v3.ncrunchproject

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

3
.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
.ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Direct2D1.v3.ncrunchproject

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

6
.ncrunch/Avalonia.Gtk3.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Input.UnitTests.net47.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Input.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Interactivity.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Layout.v3.ncrunchproject

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

3
.ncrunch/Avalonia.LeakTests.v3.ncrunchproject

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

3
.ncrunch/Avalonia.LinuxFramebuffer.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Markup.UnitTests.net47.v3.ncrunchproject

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

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

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

7
.ncrunch/Avalonia.Markup.Xaml.UnitTests.net47.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Markup.v3.ncrunchproject

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

7
.ncrunch/Avalonia.OpenGL.v3.ncrunchproject

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

7
.ncrunch/Avalonia.ReactiveUI.UnitTests.v3.ncrunchproject

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

3
.ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject

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

3
.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
.ncrunch/Avalonia.Skia.UnitTests.v3.ncrunchproject

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

6
.ncrunch/Avalonia.Skia.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Styling.UnitTests.net47.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Styling.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Themes.Default.v3.ncrunchproject

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

3
.ncrunch/Avalonia.UnitTests.v3.ncrunchproject

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

7
.ncrunch/Avalonia.Visuals.UnitTests.net47.v3.ncrunchproject

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

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

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

3
.ncrunch/Avalonia.Visuals.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject

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

3
.ncrunch/Avalonia.Win32.v3.ncrunchproject

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

7
.ncrunch/Avalonia.X11.v3.ncrunchproject

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

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

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

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

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

3
.ncrunch/Direct3DInteropSample.v3.ncrunchproject

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

7
.ncrunch/PlatformSanityChecks.v3.ncrunchproject

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

3
samples/ControlCatalog.Desktop/Program.cs

@ -26,8 +26,7 @@ namespace ControlCatalog
=> AppBuilder.Configure<App>()
.LogToDebug()
.UsePlatformDetect()
.UseReactiveUI()
.UseDataGrid();
.UseReactiveUI();
private static void ConfigureAssetAssembly(AppBuilder builder)
{

3
samples/ControlCatalog.NetCore/Program.cs

@ -47,8 +47,7 @@ namespace ControlCatalog.NetCore
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.UseSkia()
.UseReactiveUI()
.UseDataGrid();
.UseReactiveUI();
static void ConsoleSilencer()
{

2
samples/ControlCatalog/SideBar.xaml

@ -56,7 +56,7 @@
<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>

2
samples/RenderDemo/SideBar.xaml

@ -47,7 +47,7 @@
<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>

2
samples/interop/WindowsInteropTest/Program.cs

@ -15,7 +15,7 @@ namespace WindowsInteropTest
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
AppBuilder.Configure<App>().UseWin32().UseDirect2D1().UseDataGrid().SetupWithoutStarting();
AppBuilder.Configure<App>().UseWin32().UseDirect2D1().SetupWithoutStarting();
System.Windows.Forms.Application.Run(new SelectorForm());
}
}

29
src/Avalonia.Animation/Animatable.cs

@ -7,7 +7,7 @@ using System.Linq;
using System.Reactive.Linq;
using Avalonia.Collections;
using Avalonia.Data;
using Avalonia.Animation.Animators;
using Avalonia.Animation.Animators;
namespace Avalonia.Animation
{
@ -36,13 +36,27 @@ namespace Avalonia.Animation
private Transitions _transitions;
private Dictionary<AvaloniaProperty, IDisposable> _previousTransitions;
/// <summary>
/// Gets or sets the property transitions for the control.
/// </summary>
public Transitions Transitions
{
get { return _transitions ?? (_transitions = new Transitions()); }
set { SetAndRaise(TransitionsProperty, ref _transitions, value); }
get
{
if (_transitions == null)
_transitions = new Transitions();
if (_previousTransitions == null)
_previousTransitions = new Dictionary<AvaloniaProperty, IDisposable>();
return _transitions;
}
set
{
SetAndRaise(TransitionsProperty, ref _transitions, value);
}
}
/// <summary>
@ -52,13 +66,18 @@ namespace Avalonia.Animation
/// <param name="e">The event args.</param>
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs e)
{
if (e.Priority != BindingPriority.Animation && Transitions != null)
if (e.Priority != BindingPriority.Animation && Transitions != null && _previousTransitions != null)
{
var match = Transitions.FirstOrDefault(x => x.Property == e.Property);
if (match != null)
{
match.Apply(this, Clock ?? Avalonia.Animation.Clock.GlobalClock, e.OldValue, e.NewValue);
if (_previousTransitions.TryGetValue(e.Property, out var dispose))
dispose.Dispose();
var instance = match.Apply(this, Clock ?? Avalonia.Animation.Clock.GlobalClock, e.OldValue, e.NewValue);
_previousTransitions[e.Property] = instance;
}
}
}

5
src/Avalonia.Animation/Properties/AssemblyInfo.cs

@ -3,7 +3,10 @@
using Avalonia.Metadata;
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation")]
[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Easings")]
[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Animators")]
[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Animators")]
[assembly: InternalsVisibleTo("Avalonia.LeakTests")]

11
src/Avalonia.Animation/TransitionInstance.cs

@ -30,13 +30,16 @@ namespace Avalonia.Animation
{
var interpVal = (double)t.Ticks / _duration.Ticks;
if (interpVal > 1d || interpVal < 0d)
// Clamp interpolation value.
if (interpVal >= 1d | interpVal < 0d)
{
PublishNext(1d);
PublishCompleted();
return;
}
PublishNext(interpVal);
else
{
PublishNext(interpVal);
}
}
protected override void Unsubscribed()

20
src/Avalonia.Controls.DataGrid/AppBuilderExtensions.cs

@ -1,20 +0,0 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Avalonia.Controls;
using Avalonia.Threading;
namespace Avalonia
{
public static class AppBuilderExtensions
{
public static TAppBuilder UseDataGrid<TAppBuilder>(this TAppBuilder builder)
where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
{
// Portable.Xaml doesn't correctly load referenced assemblies and so doesn't
// find `DataGrid` when loading XAML. Call this method from AppBuilder as a
// temporary workaround until we fix XAML.
return builder;
}
}
}

17
src/Avalonia.Controls/AppBuilderBase.cs

@ -148,13 +148,20 @@ namespace Avalonia.Controls
public delegate void AppMainDelegate(Application app, string[] args);
public void Start()
{
Setup();
BeforeStartCallback(Self);
Instance.Run();
}
public void Start(AppMainDelegate main, string[] args)
{
Setup();
BeforeStartCallback(Self);
main(Instance, args);
}
/// <summary>
/// Sets up the platform-specific services for the application, but does not run it.
/// </summary>
@ -220,13 +227,13 @@ namespace Avalonia.Controls
/// <summary>
/// Sets the shutdown mode of the application.
/// </summary>
/// <param name="exitMode">The shutdown mode.</param>
/// <param name="shutdownMode">The shutdown mode.</param>
/// <returns></returns>
public TAppBuilder SetExitMode(ExitMode exitMode)
public TAppBuilder SetShutdownMode(ShutdownMode shutdownMode)
{
Instance.ExitMode = exitMode;
Instance.ShutdownMode = shutdownMode;
return Self;
}
}
protected virtual bool CheckSetup => true;

203
src/Avalonia.Controls/Application.cs

@ -43,8 +43,8 @@ namespace Avalonia
private readonly Styler _styler = new Styler();
private Styles _styles;
private IResourceDictionary _resources;
private CancellationTokenSource _mainLoopCancellationTokenSource;
private int _exitCode;
/// <summary>
/// Initializes a new instance of the <see cref="Application"/> class.
@ -52,10 +52,14 @@ namespace Avalonia
public Application()
{
Windows = new WindowCollection(this);
OnExit += OnExiting;
}
/// <inheritdoc/>
public event EventHandler<StartupEventArgs> Startup;
/// <inheritdoc/>
public event EventHandler<ExitEventArgs> Exit;
/// <inheritdoc/>
public event EventHandler<ResourcesChangedEventArgs> ResourcesChanged;
@ -164,14 +168,14 @@ namespace Avalonia
IResourceNode IResourceNode.ResourceParent => null;
/// <summary>
/// Gets or sets the <see cref="ExitMode"/>. This property indicates whether the application exits explicitly or implicitly.
/// If <see cref="ExitMode"/> is set to OnExplicitExit the application is only closes if Exit is called.
/// Gets or sets the <see cref="ShutdownMode"/>. This property indicates whether the application is shutdown explicitly or implicitly.
/// If <see cref="ShutdownMode"/> is set to OnExplicitShutdown the application is only closes if Shutdown is called.
/// The default is OnLastWindowClose
/// </summary>
/// <value>
/// The shutdown mode.
/// </value>
public ExitMode ExitMode { get; set; }
public ShutdownMode ShutdownMode { get; set; }
/// <summary>
/// Gets or sets the main window of the application.
@ -190,108 +194,171 @@ namespace Avalonia
public WindowCollection Windows { get; }
/// <summary>
/// Gets or sets a value indicating whether this instance is existing.
/// Gets or sets a value indicating whether this instance is shutting down.
/// </summary>
/// <value>
/// <c>true</c> if this instance is existing; otherwise, <c>false</c>.
/// <c>true</c> if this instance is shutting down; otherwise, <c>false</c>.
/// </value>
internal bool IsExiting { get; set; }
internal bool IsShuttingDown { get; private set; }
/// <summary>
/// Initializes the application by loading XAML etc.
/// </summary>
public virtual void Initialize()
public virtual void Initialize() { }
/// <summary>
/// Runs the application's main loop.
/// </summary>
/// <remarks>
/// This will return when the <see cref="Avalonia.Controls.ShutdownMode"/> condition is met
/// or <see cref="Shutdown(int)"/> was called.
/// </remarks>
/// <returns>The application's exit code that is returned to the operating system on termination.</returns>
public int Run()
{
return Run(new CancellationTokenSource());
}
/// <summary>
/// Runs the application's main loop until the <see cref="ICloseable"/> is closed.
/// Runs the application's main loop.
/// </summary>
/// <param name="closable">The closable to track</param>
public void Run(ICloseable closable)
/// <remarks>
/// This will return when the <see cref="Avalonia.Controls.ShutdownMode"/> condition is met
/// or <see cref="Shutdown(int)"/> was called.
/// This also returns when <see cref="ICloseable"/> is closed.
/// </remarks>
/// <param name="closable">The closable to track.</param>
/// <returns>The application's exit code that is returned to the operating system on termination.</returns>
public int Run(ICloseable closable)
{
if (_mainLoopCancellationTokenSource != null)
closable.Closed += (s, e) => _mainLoopCancellationTokenSource?.Cancel();
return Run(new CancellationTokenSource());
}
/// <summary>
/// Runs the application's main loop.
/// </summary>
/// <remarks>
/// This will return when the <see cref="Avalonia.Controls.ShutdownMode"/> condition is met
/// or <see cref="Shutdown(int)"/> was called.
/// </remarks>
/// <param name="mainWindow">The window that is used as <see cref="MainWindow"/>
/// when the <see cref="MainWindow"/> isn't already set.</param>
/// <returns>The application's exit code that is returned to the operating system on termination.</returns>
public int Run(Window mainWindow)
{
if (mainWindow == null)
{
throw new Exception("Run should only called once");
throw new ArgumentNullException(nameof(mainWindow));
}
closable.Closed += (s, e) => Exit();
_mainLoopCancellationTokenSource = new CancellationTokenSource();
if (MainWindow == null)
{
Dispatcher.UIThread.Post(() =>
{
if (!mainWindow.IsVisible)
{
mainWindow.Show();
}
Dispatcher.UIThread.MainLoop(_mainLoopCancellationTokenSource.Token);
MainWindow = mainWindow;
});
}
// Make sure we call OnExit in case an error happened and Exit() wasn't called explicitly
if (!IsExiting)
{
OnExit?.Invoke(this, EventArgs.Empty);
}
return Run(new CancellationTokenSource());
}
/// <summary>
/// Runs the application's main loop until some condition occurs that is specified by ExitMode.
/// Runs the application's main loop.
/// </summary>
/// <param name="mainWindow">The main window</param>
public void Run(Window mainWindow)
/// <remarks>
/// This will return when the <see cref="Avalonia.Controls.ShutdownMode"/> condition is met
/// or <see cref="Shutdown(int)"/> was called.
/// This also returns when the <see cref="CancellationToken"/> is canceled.
/// </remarks>
/// <returns>The application's exit code that is returned to the operating system on termination.</returns>
/// <param name="token">The token to track.</param>
public int Run(CancellationToken token)
{
if (_mainLoopCancellationTokenSource != null)
return Run(CancellationTokenSource.CreateLinkedTokenSource(token));
}
private int Run(CancellationTokenSource tokenSource)
{
if (IsShuttingDown)
{
throw new Exception("Run should only called once");
throw new InvalidOperationException("Application is shutting down.");
}
_mainLoopCancellationTokenSource = new CancellationTokenSource();
if (MainWindow == null)
if (_mainLoopCancellationTokenSource != null)
{
if (mainWindow == null)
{
throw new ArgumentNullException(nameof(mainWindow));
}
throw new InvalidOperationException("Application is already running.");
}
if (!mainWindow.IsVisible)
{
mainWindow.Show();
}
_mainLoopCancellationTokenSource = tokenSource;
MainWindow = mainWindow;
}
Dispatcher.UIThread.Post(() => OnStartup(new StartupEventArgs()), DispatcherPriority.Send);
Dispatcher.UIThread.MainLoop(_mainLoopCancellationTokenSource.Token);
// Make sure we call OnExit in case an error happened and Exit() wasn't called explicitly
if (!IsExiting)
if (!IsShuttingDown)
{
OnExit?.Invoke(this, EventArgs.Empty);
Shutdown(_exitCode);
}
return _exitCode;
}
/// <summary>
/// Runs the application's main loop until the <see cref="CancellationToken"/> is canceled.
/// Raises the <see cref="Startup"/> event.
/// </summary>
/// <param name="token">The token to track</param>
public void Run(CancellationToken token)
/// <param name="e">A <see cref="StartupEventArgs"/> that contains the event data.</param>
protected virtual void OnStartup(StartupEventArgs e)
{
Dispatcher.UIThread.MainLoop(token);
// Make sure we call OnExit in case an error happened and Exit() wasn't called explicitly
if (!IsExiting)
{
OnExit?.Invoke(this, EventArgs.Empty);
}
Startup?.Invoke(this, e);
}
/// <summary>
/// Exits the application
/// Raises the <see cref="Exit"/> event.
/// </summary>
public void Exit()
/// <param name="e">A <see cref="ExitEventArgs"/> that contains the event data.</param>
protected virtual void OnExit(ExitEventArgs e)
{
IsExiting = true;
Exit?.Invoke(this, e);
}
/// <inheritdoc/>
public void Shutdown(int exitCode = 0)
{
if (IsShuttingDown)
{
throw new InvalidOperationException("Application is already shutting down.");
}
_exitCode = exitCode;
IsShuttingDown = true;
Windows.Clear();
OnExit?.Invoke(this, EventArgs.Empty);
try
{
var e = new ExitEventArgs { ApplicationExitCode = _exitCode };
OnExit(e);
_exitCode = e.ApplicationExitCode;
}
finally
{
_mainLoopCancellationTokenSource?.Cancel();
_mainLoopCancellationTokenSource = null;
IsShuttingDown = false;
_mainLoopCancellationTokenSource?.Cancel();
Environment.ExitCode = _exitCode;
}
}
/// <inheritdoc/>
@ -302,20 +369,6 @@ namespace Avalonia
Styles.TryGetResource(key, out value);
}
/// <summary>
/// Sent when the application is exiting.
/// </summary>
public event EventHandler OnExit;
/// <summary>
/// Called when the application is exiting.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void OnExiting(object sender, EventArgs e)
{
}
/// <summary>
/// Register's the services needed by Avalonia.
/// </summary>

18
src/Avalonia.Controls/ExitEventArgs.cs

@ -0,0 +1,18 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
namespace Avalonia.Controls
{
/// <summary>
/// Contains the arguments for the <see cref="IApplicationLifecycle.Exit"/> event.
/// </summary>
public class ExitEventArgs : EventArgs
{
/// <summary>
/// Gets or sets the exit code that an application returns to the operating system when the application exits.
/// </summary>
public int ApplicationExitCode { get; set; }
}
}

12
src/Avalonia.Controls/IApplicationLifecycle.cs

@ -7,14 +7,20 @@ namespace Avalonia.Controls
/// </summary>
public interface IApplicationLifecycle
{
/// <summary>
/// Sent when the application is starting up.
/// </summary>
event EventHandler<StartupEventArgs> Startup;
/// <summary>
/// Sent when the application is exiting.
/// </summary>
event EventHandler OnExit;
event EventHandler<ExitEventArgs> Exit;
/// <summary>
/// Exits the application.
/// Shuts down the application and sets the exit code that is returned to the operating system when the application exits.
/// </summary>
void Exit();
/// <param name="exitCode">An integer exit code for an application. The default exit code is 0.</param>
void Shutdown(int exitCode = 0);
}
}

16
src/Avalonia.Controls/ExitMode.cs → src/Avalonia.Controls/ShutdownMode.cs

@ -1,26 +1,26 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
namespace Avalonia
namespace Avalonia.Controls
{
/// <summary>
/// Enum for ExitMode
/// Describes the possible values for <see cref="Application.ShutdownMode"/>.
/// </summary>
public enum ExitMode
public enum ShutdownMode
{
/// <summary>
/// Indicates an implicit call to Application.Exit when the last window closes.
/// Indicates an implicit call to Application.Shutdown when the last window closes.
/// </summary>
OnLastWindowClose,
/// <summary>
/// Indicates an implicit call to Application.Exit when the main window closes.
/// Indicates an implicit call to Application.Shutdown when the main window closes.
/// </summary>
OnMainWindowClose,
/// <summary>
/// Indicates that the application only exits on an explicit call to Application.Exit.
/// Indicates that the application only exits on an explicit call to Application.Shutdown.
/// </summary>
OnExplicitExit
OnExplicitShutdown
}
}
}

36
src/Avalonia.Controls/StartupEventArgs.cs

@ -0,0 +1,36 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
namespace Avalonia.Controls
{
/// <summary>
/// Contains the arguments for the <see cref="IApplicationLifecycle.Startup"/> event.
/// </summary>
public class StartupEventArgs : EventArgs
{
private string[] _args;
/// <summary>
/// Gets the command line arguments that were passed to the application.
/// </summary>
public IReadOnlyList<string> Args => _args ?? (_args = GetArgs());
private static string[] GetArgs()
{
try
{
var args = Environment.GetCommandLineArgs();
return args.Length > 1 ? args.Skip(1).ToArray() : new string[0];
}
catch (NotSupportedException)
{
return new string[0];
}
}
}
}

4
src/Avalonia.Controls/TopLevel.cs

@ -127,7 +127,7 @@ namespace Avalonia.Controls
if (_applicationLifecycle != null)
{
_applicationLifecycle.OnExit += OnApplicationExiting;
_applicationLifecycle.Exit += OnApplicationExiting;
}
if (((IStyleHost)this).StylingParent is IResourceProvider applicationResources)
@ -281,7 +281,7 @@ namespace Avalonia.Controls
Closed?.Invoke(this, EventArgs.Empty);
Renderer?.Dispose();
Renderer = null;
_applicationLifecycle.OnExit -= OnApplicationExiting;
_applicationLifecycle.Exit -= OnApplicationExiting;
}
/// <summary>

4
src/Avalonia.Controls/Window.cs

@ -250,7 +250,7 @@ namespace Avalonia.Controls
/// <summary>
/// Fired before a window is closed.
/// </summary>
public event EventHandler<CancelEventArgs> Closing;
public event EventHandler<CancelEventArgs> Closing;
private static void AddWindow(Window window)
{
@ -440,7 +440,7 @@ namespace Avalonia.Controls
/// </returns>
public Task<TResult> ShowDialog<TResult>(IWindowImpl owner)
{
if(owner == null)
if (owner == null)
throw new ArgumentNullException(nameof(owner));
if (IsVisible)

12
src/Avalonia.Controls/WindowCollection.cs

@ -107,24 +107,24 @@ namespace Avalonia
return;
}
if (_application.IsExiting)
if (_application.IsShuttingDown)
{
return;
}
switch (_application.ExitMode)
switch (_application.ShutdownMode)
{
case ExitMode.OnLastWindowClose:
case ShutdownMode.OnLastWindowClose:
if (Count == 0)
{
_application.Exit();
_application.Shutdown();
}
break;
case ExitMode.OnMainWindowClose:
case ShutdownMode.OnMainWindowClose:
if (window == _application.MainWindow)
{
_application.Exit();
_application.Shutdown();
}
break;

73
tests/Avalonia.Animation.UnitTests/TransitionsTests.cs

@ -0,0 +1,73 @@
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Animation;
using Avalonia.Controls;
using Avalonia.Styling;
using Avalonia.UnitTests;
using Avalonia.Data;
using Xunit;
using Avalonia.Animation.Easings;
namespace Avalonia.Animation.UnitTests
{
public class TransitionsTests
{
[Fact]
public void Check_Transitions_Interpolation_Negative_Bounds_Clamp()
{
var clock = new MockGlobalClock();
using (UnitTestApplication.Start(new TestServices(globalClock: clock)))
{
var border = new Border
{
Transitions =
{
new DoubleTransition
{
Duration = TimeSpan.FromSeconds(1),
Property = Border.OpacityProperty,
}
}
};
border.Opacity = 0;
clock.Pulse(TimeSpan.FromSeconds(0));
clock.Pulse(TimeSpan.FromSeconds(-0.5));
Assert.Equal(0, border.Opacity);
}
}
[Fact]
public void Check_Transitions_Interpolation_Positive_Bounds_Clamp()
{
var clock = new MockGlobalClock();
using (UnitTestApplication.Start(new TestServices(globalClock: clock)))
{
var border = new Border
{
Transitions =
{
new DoubleTransition
{
Duration = TimeSpan.FromSeconds(1),
Property = Border.OpacityProperty,
}
}
};
border.Opacity = 0;
clock.Pulse(TimeSpan.FromSeconds(0));
clock.Pulse(TimeSpan.FromMilliseconds(1001));
Assert.Equal(0, border.Opacity);
}
}
}
}

48
tests/Avalonia.Controls.UnitTests/ApplicationTests.cs

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using Avalonia.Threading;
using Avalonia.UnitTests;
using Xunit;
@ -15,7 +16,11 @@ namespace Avalonia.Controls.UnitTests
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
Application.Current.ExitMode = ExitMode.OnMainWindowClose;
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
var hasExit = false;
Application.Current.Exit += (s, e) => hasExit = true;
var mainWindow = new Window();
@ -29,7 +34,7 @@ namespace Avalonia.Controls.UnitTests
mainWindow.Close();
Assert.True(Application.Current.IsExiting);
Assert.True(hasExit);
}
}
@ -38,7 +43,11 @@ namespace Avalonia.Controls.UnitTests
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
Application.Current.ExitMode = ExitMode.OnLastWindowClose;
Application.Current.ShutdownMode = ShutdownMode.OnLastWindowClose;
var hasExit = false;
Application.Current.Exit += (s, e) => hasExit = true;
var windowA = new Window();
@ -50,11 +59,11 @@ namespace Avalonia.Controls.UnitTests
windowA.Close();
Assert.False(Application.Current.IsExiting);
Assert.False(hasExit);
windowB.Close();
Assert.True(Application.Current.IsExiting);
Assert.True(hasExit);
}
}
@ -63,7 +72,11 @@ namespace Avalonia.Controls.UnitTests
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
Application.Current.ExitMode = ExitMode.OnExplicitExit;
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
var hasExit = false;
Application.Current.Exit += (s, e) => hasExit = true;
var windowA = new Window();
@ -75,15 +88,15 @@ namespace Avalonia.Controls.UnitTests
windowA.Close();
Assert.False(Application.Current.IsExiting);
Assert.False(hasExit);
windowB.Close();
Assert.False(Application.Current.IsExiting);
Assert.False(hasExit);
Application.Current.Exit();
Application.Current.Shutdown();
Assert.True(Application.Current.IsExiting);
Assert.True(hasExit);
}
}
@ -99,7 +112,7 @@ namespace Avalonia.Controls.UnitTests
window.Show();
}
Application.Current.Exit();
Application.Current.Shutdown();
Assert.Empty(Application.Current.Windows);
}
@ -129,5 +142,18 @@ namespace Avalonia.Controls.UnitTests
Assert.True(raised);
}
}
[Fact]
public void Should_Set_ExitCode_After_Shutdown()
{
using (UnitTestApplication.Start(TestServices.MockThreadingInterface))
{
Application.Current.Shutdown(1337);
var exitCode = Application.Current.Run();
Assert.Equal(1337, exitCode);
}
}
}
}

2
tests/Avalonia.Controls.UnitTests/TopLevelTests.cs

@ -215,7 +215,7 @@ namespace Avalonia.Controls.UnitTests
var impl = new Mock<ITopLevelImpl>();
impl.SetupAllProperties();
var target = new TestTopLevel(impl.Object);
UnitTestApplication.Current.Exit();
UnitTestApplication.Current.Shutdown();
Assert.True(target.IsClosed);
}
}

60
tests/Avalonia.LeakTests/TransitionTests.cs

@ -0,0 +1,60 @@
using System;
using Avalonia.Animation;
using Avalonia.Controls;
using Avalonia.UnitTests;
using JetBrains.dotMemoryUnit;
using Xunit;
using Xunit.Abstractions;
namespace Avalonia.LeakTests
{
[DotMemoryUnit(FailIfRunWithoutSupport = false)]
public class TransitionTests
{
public TransitionTests(ITestOutputHelper atr)
{
DotMemoryUnitTestOutput.SetOutputMethod(atr.WriteLine);
}
[Fact(Skip = "TODO: Fix this leak")]
public void Transition_On_StyledProperty_Is_Freed()
{
var clock = new MockGlobalClock();
using (UnitTestApplication.Start(new TestServices(globalClock: clock)))
{
Func<Border> run = () =>
{
var border = new Border
{
Transitions =
{
new DoubleTransition
{
Duration = TimeSpan.FromSeconds(1),
Property = Border.OpacityProperty,
}
}
};
border.Opacity = 0;
clock.Pulse(TimeSpan.FromSeconds(0));
clock.Pulse(TimeSpan.FromSeconds(0.5));
Assert.Equal(0.5, border.Opacity);
clock.Pulse(TimeSpan.FromSeconds(1));
Assert.Equal(0, border.Opacity);
return border;
};
var result = run();
dotMemory.Check(memory =>
Assert.Equal(0, memory.GetObjects(where => where.Type.Is<TransitionInstance>()).ObjectsCount));
}
}
}
}

10
tests/Avalonia.UnitTests/MockGlobalClock.cs

@ -0,0 +1,10 @@
using System;
using Avalonia.Animation;
namespace Avalonia.UnitTests
{
public class MockGlobalClock : ClockBase, IGlobalClock
{
public new void Pulse(TimeSpan systemTime) => base.Pulse(systemTime);
}
}

6
tests/Avalonia.UnitTests/TestServices.cs

@ -16,6 +16,7 @@ using System.Reactive.Concurrency;
using System.Collections.Generic;
using Avalonia.Controls;
using System.Reflection;
using Avalonia.Animation;
namespace Avalonia.UnitTests
{
@ -58,6 +59,7 @@ namespace Avalonia.UnitTests
public TestServices(
IAssetLoader assetLoader = null,
IFocusManager focusManager = null,
IGlobalClock globalClock = null,
IInputManager inputManager = null,
Func<IKeyboardDevice> keyboardDevice = null,
IKeyboardNavigationHandler keyboardNavigation = null,
@ -75,6 +77,7 @@ namespace Avalonia.UnitTests
{
AssetLoader = assetLoader;
FocusManager = focusManager;
GlobalClock = globalClock;
InputManager = inputManager;
KeyboardDevice = keyboardDevice;
KeyboardNavigation = keyboardNavigation;
@ -93,6 +96,7 @@ namespace Avalonia.UnitTests
public IAssetLoader AssetLoader { get; }
public IInputManager InputManager { get; }
public IFocusManager FocusManager { get; }
public IGlobalClock GlobalClock { get; }
public Func<IKeyboardDevice> KeyboardDevice { get; }
public IKeyboardNavigationHandler KeyboardNavigation { get; }
public Func<IMouseDevice> MouseDevice { get; }
@ -109,6 +113,7 @@ namespace Avalonia.UnitTests
public TestServices With(
IAssetLoader assetLoader = null,
IFocusManager focusManager = null,
IGlobalClock globalClock = null,
IInputManager inputManager = null,
Func<IKeyboardDevice> keyboardDevice = null,
IKeyboardNavigationHandler keyboardNavigation = null,
@ -127,6 +132,7 @@ namespace Avalonia.UnitTests
return new TestServices(
assetLoader: assetLoader ?? AssetLoader,
focusManager: focusManager ?? FocusManager,
globalClock: globalClock ?? GlobalClock,
inputManager: inputManager ?? InputManager,
keyboardDevice: keyboardDevice ?? KeyboardDevice,
keyboardNavigation: keyboardNavigation ?? KeyboardNavigation,

2
tests/Avalonia.UnitTests/UnitTestApplication.cs

@ -12,6 +12,7 @@ using Avalonia.Threading;
using System.Reactive.Disposables;
using System.Reactive.Concurrency;
using Avalonia.Input.Platform;
using Avalonia.Animation;
namespace Avalonia.UnitTests
{
@ -52,6 +53,7 @@ namespace Avalonia.UnitTests
AvaloniaLocator.CurrentMutable
.Bind<IAssetLoader>().ToConstant(Services.AssetLoader)
.Bind<IFocusManager>().ToConstant(Services.FocusManager)
.Bind<IGlobalClock>().ToConstant(Services.GlobalClock)
.BindToSelf<IGlobalStyles>(this)
.Bind<IInputManager>().ToConstant(Services.InputManager)
.Bind<IKeyboardDevice>().ToConstant(Services.KeyboardDevice?.Invoke())

Loading…
Cancel
Save