From a0ffb8ec9890d7217835403a79c42cd9aae567a0 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 28 Jun 2019 10:40:09 +0300 Subject: [PATCH] Added a "script" to load all control catalog pages in headless mode --- samples/ControlCatalog.NetCore/Program.cs | 46 +++++++++++++++++++++ src/Avalonia.Headless/HeadlessWindowImpl.cs | 8 +++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index 91f05ca719..766f3c5afa 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -2,8 +2,12 @@ using System.Diagnostics; using System.Linq; using System.Threading; +using System.Threading.Tasks; using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Headless; +using Avalonia.LogicalTree; using Avalonia.Skia; using Avalonia.ReactiveUI; using Avalonia.Threading; @@ -37,6 +41,48 @@ namespace ControlCatalog.NetCore { return builder.StartWithHeadlessVncPlatform(null, 5901, args, ShutdownMode.OnMainWindowClose); } + else if (args.Contains("--full-headless")) + { + return builder + .UseHeadless(true) + .AfterSetup(_ => + { + DispatcherTimer.RunOnce(async () => + { + var window = ((IClassicDesktopStyleApplicationLifetime)Application.Current.ApplicationLifetime) + .MainWindow; + var tc = window.GetLogicalDescendants().OfType().First(); + foreach (var page in tc.Items.Cast().ToList()) + { + // Skip DatePicker because of some layout bug in grid + if (page.Header.ToString() == "DatePicker") + continue; + Console.WriteLine("Selecting " + page.Header); + tc.SelectedItem = page; + await Task.Delay(500); + } + Console.WriteLine("Selecting the first page"); + tc.SelectedItem = tc.Items.OfType().First(); + await Task.Delay(500); + Console.WriteLine("Clicked through all pages, triggering GC"); + for (var c = 0; c < 3; c++) + { + GC.Collect(2, GCCollectionMode.Forced); + await Task.Delay(500); + } + + void FormatMem(string metric, long bytes) + { + Console.WriteLine(metric + ": " + bytes / 1024 / 1024 + "MB"); + } + + FormatMem("GC allocated bytes", GC.GetTotalMemory(true)); + FormatMem("WorkingSet64", Process.GetCurrentProcess().WorkingSet64); + + }, TimeSpan.FromSeconds(1)); + }) + .StartWithClassicDesktopLifetime(args); + } else return builder.StartWithClassicDesktopLifetime(args); } diff --git a/src/Avalonia.Headless/HeadlessWindowImpl.cs b/src/Avalonia.Headless/HeadlessWindowImpl.cs index 550defa815..b19abffc01 100644 --- a/src/Avalonia.Headless/HeadlessWindowImpl.cs +++ b/src/Avalonia.Headless/HeadlessWindowImpl.cs @@ -118,8 +118,12 @@ namespace Avalonia.Headless void DoResize(Size clientSize) { - ClientSize = clientSize; - Resized?.Invoke(clientSize); + // Uncomment this check and experience a weird bug in layout engine + if (ClientSize != clientSize) + { + ClientSize = clientSize; + Resized?.Invoke(clientSize); + } } public void SetMinMaxSize(Size minSize, Size maxSize)