Browse Source

Fix window Loaded and Unloaded events

pull/8738/head
Max Katz 4 years ago
parent
commit
18128a59de
  1. 8
      src/Avalonia.Controls/Control.cs
  2. 71
      tests/Avalonia.Controls.UnitTests/LoadedTests.cs

8
src/Avalonia.Controls/Control.cs

@ -8,6 +8,7 @@ using Avalonia.Controls.Templates;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.LogicalTree;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Styling; using Avalonia.Styling;
@ -104,7 +105,6 @@ namespace Avalonia.Controls
private static readonly HashSet<Control> _loadedQueue = new HashSet<Control>(); private static readonly HashSet<Control> _loadedQueue = new HashSet<Control>();
private static readonly HashSet<Control> _loadedProcessingQueue = new HashSet<Control>(); private static readonly HashSet<Control> _loadedProcessingQueue = new HashSet<Control>();
private bool _isAttachedToVisualTree = false;
private bool _isLoaded = false; private bool _isLoaded = false;
private DataTemplates? _dataTemplates; private DataTemplates? _dataTemplates;
private IControl? _focusAdorner; private IControl? _focusAdorner;
@ -344,10 +344,10 @@ namespace Avalonia.Controls
/// Invoked as the first step of marking the control as loaded and raising the /// Invoked as the first step of marking the control as loaded and raising the
/// <see cref="Loaded"/> event. /// <see cref="Loaded"/> event.
/// </summary> /// </summary>
internal void OnLoadedCore() internal virtual void OnLoadedCore()
{ {
if (_isLoaded == false && if (_isLoaded == false &&
_isAttachedToVisualTree) ((ILogical)this).IsAttachedToLogicalTree)
{ {
_isLoaded = true; _isLoaded = true;
OnLoaded(); OnLoaded();
@ -395,7 +395,6 @@ namespace Avalonia.Controls
protected sealed override void OnAttachedToVisualTreeCore(VisualTreeAttachmentEventArgs e) protected sealed override void OnAttachedToVisualTreeCore(VisualTreeAttachmentEventArgs e)
{ {
base.OnAttachedToVisualTreeCore(e); base.OnAttachedToVisualTreeCore(e);
_isAttachedToVisualTree = true;
InitializeIfNeeded(); InitializeIfNeeded();
@ -406,7 +405,6 @@ namespace Avalonia.Controls
protected sealed override void OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e) protected sealed override void OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e)
{ {
base.OnDetachedFromVisualTreeCore(e); base.OnDetachedFromVisualTreeCore(e);
_isAttachedToVisualTree = false;
OnUnloadedCore(); OnUnloadedCore();
} }

71
tests/Avalonia.Controls.UnitTests/LoadedTests.cs

@ -0,0 +1,71 @@
using Avalonia.Platform;
using Avalonia.Threading;
using Avalonia.UnitTests;
using Moq;
using Xunit;
namespace Avalonia.Controls.UnitTests;
public class LoadedTests
{
[Fact]
public void Window_Loads_And_Unloads()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
int loadedCount = 0, unloadedCount = 0;
var target = new Window();
target.Loaded += (_, _) => loadedCount++;
target.Unloaded += (_, _) => unloadedCount++;
Assert.Equal(0, loadedCount);
Assert.Equal(0, unloadedCount);
target.Show();
Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
Assert.True(target.IsLoaded);
Assert.Equal(1, loadedCount);
Assert.Equal(0, unloadedCount);
target.Close();
Assert.Equal(1, loadedCount);
Assert.Equal(1, unloadedCount);
Assert.False(target.IsLoaded);
}
}
[Fact]
public void Control_Loads_And_Unloads()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
int loadedCount = 0, unloadedCount = 0;
var window = new Window();
window.Show();
var target = new Button();
target.Loaded += (_, _) => loadedCount++;
target.Unloaded += (_, _) => unloadedCount++;
Assert.Equal(0, loadedCount);
Assert.Equal(0, unloadedCount);
window.Content = target;
Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
Assert.True(target.IsLoaded);
Assert.Equal(1, loadedCount);
Assert.Equal(0, unloadedCount);
window.Content = null;
Assert.Equal(1, loadedCount);
Assert.Equal(1, unloadedCount);
Assert.False(target.IsLoaded);
}
}
}
Loading…
Cancel
Save