DesktopApplicationExtensions.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Threading;
  3. using Avalonia.Controls;
  4. using Avalonia.Input;
  5. using Avalonia.Threading;
  6. namespace Avalonia.Controls
  7. {
  8. public static class DesktopApplicationExtensions
  9. {
  10. [Obsolete("Running application without a cancellation token and a lifetime is no longer supported, see https://github.com/AvaloniaUI/Avalonia/wiki/Application-lifetimes for details", true)]
  11. public static void Run(this Application app) => throw new NotSupportedException();
  12. /// <summary>
  13. /// On desktop-style platforms runs the application's main loop until closable is closed
  14. /// </summary>
  15. /// <remarks>
  16. /// Consider using StartWithDesktopStyleLifetime instead, see https://github.com/AvaloniaUI/Avalonia/wiki/Application-lifetimes for details
  17. /// </remarks>
  18. public static void Run(this Application app, ICloseable closable)
  19. {
  20. var cts = new CancellationTokenSource();
  21. closable.Closed += (s, e) => cts.Cancel();
  22. app.Run(cts.Token);
  23. }
  24. /// <summary>
  25. /// On desktop-style platforms runs the application's main loop until main window is closed
  26. /// </summary>
  27. /// <remarks>
  28. /// Consider using StartWithDesktopStyleLifetime instead, see https://github.com/AvaloniaUI/Avalonia/wiki/Application-lifetimes for details
  29. /// </remarks>
  30. public static void Run(this Application app, Window mainWindow)
  31. {
  32. if (mainWindow == null)
  33. {
  34. throw new ArgumentNullException(nameof(mainWindow));
  35. }
  36. var cts = new CancellationTokenSource();
  37. mainWindow.Closed += (_, __) => cts.Cancel();
  38. if (!mainWindow.IsVisible)
  39. {
  40. mainWindow.Show();
  41. }
  42. app.Run(cts.Token);
  43. }
  44. /// <summary>
  45. /// On desktop-style platforms runs the application's main loop with custom CancellationToken
  46. /// without setting a lifetime.
  47. /// </summary>
  48. /// <param name="app">The application.</param>
  49. /// <param name="token">The token to track.</param>
  50. public static void Run(this Application app, CancellationToken token)
  51. {
  52. Dispatcher.UIThread.MainLoop(token);
  53. }
  54. public static void RunWithMainWindow<TWindow>(this Application app)
  55. where TWindow : Avalonia.Controls.Window, new()
  56. {
  57. var window = new TWindow();
  58. window.Show();
  59. app.Run(window);
  60. }
  61. }
  62. }