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