1
0

Program.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq;
  4. using System.Runtime.Versioning;
  5. using System.Threading.Tasks;
  6. using System.Web;
  7. using Avalonia;
  8. using Avalonia.Browser;
  9. using Avalonia.Controls;
  10. using Avalonia.Controls.ApplicationLifetimes;
  11. using Avalonia.Logging;
  12. using Avalonia.Rendering;
  13. using Avalonia.Threading;
  14. using ControlCatalog;
  15. using ControlCatalog.Browser;
  16. [assembly:SupportedOSPlatform("browser")]
  17. #nullable enable
  18. internal partial class Program
  19. {
  20. public static async Task Main(string[] args)
  21. {
  22. Trace.Listeners.Add(new ConsoleTraceListener());
  23. var options = ParseArgs(args) ?? new BrowserPlatformOptions();
  24. await BuildAvaloniaApp()
  25. .LogToTrace()
  26. .AfterSetup(_ =>
  27. {
  28. ControlCatalog.Pages.EmbedSample.Implementation = new EmbedSampleWeb();
  29. })
  30. .StartBrowserAppAsync("out", options);
  31. Dispatcher.UIThread.Invoke(() =>
  32. {
  33. if (Application.Current!.ApplicationLifetime is ISingleTopLevelApplicationLifetime lifetime)
  34. {
  35. lifetime.TopLevel!.RendererDiagnostics.DebugOverlays = RendererDebugOverlays.Fps;
  36. }
  37. });
  38. }
  39. // Test with multiple AvaloniaView at once.
  40. // private static AvaloniaView _avaloniaView1;
  41. // private static AvaloniaView _avaloniaView2;
  42. // public static async Task Main(string[] args)
  43. // {
  44. // Trace.Listeners.Add(new ConsoleTraceListener());
  45. //
  46. // var options = ParseArgs(args) ?? new BrowserPlatformOptions();
  47. //
  48. // await BuildAvaloniaApp()
  49. // .LogToTrace()
  50. // .SetupBrowserAppAsync(options);
  51. //
  52. // _avaloniaView1 = new AvaloniaView("out1");
  53. // _avaloniaView1.Content = new TextBlock { Text = "Hello" };
  54. //
  55. // _avaloniaView2 = new AvaloniaView("out2");
  56. // _avaloniaView2.Content = new TextBlock { Text = "World" };
  57. //
  58. // Dispatcher.UIThread.Invoke(() =>
  59. // {
  60. // var topLevel = TopLevel.GetTopLevel(_avaloniaView1.Content);
  61. // topLevel!.RendererDiagnostics.DebugOverlays = RendererDebugOverlays.Fps;
  62. // });
  63. // }
  64. public static AppBuilder BuildAvaloniaApp()
  65. => AppBuilder.Configure<App>();
  66. private static BrowserPlatformOptions? ParseArgs(string[] args)
  67. {
  68. try
  69. {
  70. if (args.Length == 0
  71. || !Uri.TryCreate(args[0], UriKind.Absolute, out var uri)
  72. || uri.Query.Length <= 1)
  73. {
  74. uri = new Uri("http://localhost");
  75. }
  76. var queryParams = HttpUtility.ParseQueryString(uri.Query);
  77. var options = new BrowserPlatformOptions();
  78. if (bool.TryParse(queryParams[nameof(options.PreferFileDialogPolyfill)], out var preferDialogsPolyfill))
  79. {
  80. options.PreferFileDialogPolyfill = preferDialogsPolyfill;
  81. }
  82. if (queryParams[nameof(options.RenderingMode)] is { } renderingModePairs)
  83. {
  84. options.RenderingMode = renderingModePairs
  85. .Split(';', StringSplitOptions.RemoveEmptyEntries)
  86. .Select(entry => Enum.Parse<BrowserRenderingMode>(entry, true))
  87. .ToArray();
  88. }
  89. Console.WriteLine("DemoBrowserPlatformOptions.PreferFileDialogPolyfill: " + options.PreferFileDialogPolyfill);
  90. Console.WriteLine("DemoBrowserPlatformOptions.RenderingMode: " + string.Join(";", options.RenderingMode));
  91. return options;
  92. }
  93. catch (Exception ex)
  94. {
  95. Console.WriteLine("ParseArgs of DemoBrowserPlatformOptions failed: " + ex);
  96. return null;
  97. }
  98. }
  99. }