diff --git a/src/Avalonia.Controls/WindowBase.cs b/src/Avalonia.Controls/WindowBase.cs index 4973691716..18cc9a3419 100644 --- a/src/Avalonia.Controls/WindowBase.cs +++ b/src/Avalonia.Controls/WindowBase.cs @@ -29,10 +29,12 @@ namespace Avalonia.Controls AvaloniaProperty.RegisterDirect(nameof(IsActive), o => o.IsActive); private bool _isActive; + private bool _ignoreVisibilityChange; static WindowBase() { IsVisibleProperty.OverrideDefaultValue(false); + IsVisibleProperty.Changed.AddClassHandler(x => x.IsVisibleChanged); } public WindowBase(IWindowBaseImpl impl) : this(impl, AvaloniaLocator.Current) @@ -104,8 +106,17 @@ namespace Avalonia.Controls /// public virtual void Hide() { - PlatformImpl.Hide(); - IsVisible = false; + _ignoreVisibilityChange = true; + + try + { + PlatformImpl.Hide(); + IsVisible = false; + } + finally + { + _ignoreVisibilityChange = false; + } } /// @@ -113,10 +124,19 @@ namespace Avalonia.Controls /// public virtual void Show() { - EnsureInitialized(); - IsVisible = true; - LayoutManager.Instance.ExecuteInitialLayoutPass(this); - PlatformImpl.Show(); + _ignoreVisibilityChange = true; + + try + { + EnsureInitialized(); + IsVisible = true; + LayoutManager.Instance.ExecuteInitialLayoutPass(this); + PlatformImpl.Show(); + } + finally + { + _ignoreVisibilityChange = false; + } } /// @@ -164,8 +184,17 @@ namespace Avalonia.Controls protected override void HandleClosed() { - IsVisible = false; - base.HandleClosed(); + _ignoreVisibilityChange = true; + + try + { + IsVisible = false; + base.HandleClosed(); + } + finally + { + _ignoreVisibilityChange = false; + } } /// @@ -222,6 +251,21 @@ namespace Avalonia.Controls Deactivated?.Invoke(this, EventArgs.Empty); } + private void IsVisibleChanged(AvaloniaPropertyChangedEventArgs e) + { + if (!_ignoreVisibilityChange) + { + if ((bool)e.NewValue) + { + Show(); + } + else + { + Hide(); + } + } + } + /// /// Starts moving a window with left button being held. Should be called from left mouse button press event handler /// diff --git a/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs index f565d640b6..d1f8d5b912 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs @@ -152,6 +152,37 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void Setting_IsVisible_True_Shows_Window() + { + var windowImpl = new Mock(); + windowImpl.Setup(x => x.Scaling).Returns(1); + + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var target = new TestWindowBase(windowImpl.Object); + target.IsVisible = true; + + windowImpl.Verify(x => x.Show()); + } + } + + [Fact] + public void Setting_IsVisible_False_Hides_Window() + { + var windowImpl = new Mock(); + windowImpl.Setup(x => x.Scaling).Returns(1); + + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var target = new TestWindowBase(windowImpl.Object); + target.Show(); + target.IsVisible = false; + + windowImpl.Verify(x => x.Hide()); + } + } + private FuncControlTemplate CreateTemplate() { return new FuncControlTemplate(x =>