فهرست منبع

Make WindowBase.IsVisible show/hide window.

Steven Kirk 8 سال پیش
والد
کامیت
e9968a7606
2فایلهای تغییر یافته به همراه83 افزوده شده و 8 حذف شده
  1. 52 8
      src/Avalonia.Controls/WindowBase.cs
  2. 31 0
      tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs

+ 52 - 8
src/Avalonia.Controls/WindowBase.cs

@@ -29,10 +29,12 @@ namespace Avalonia.Controls
             AvaloniaProperty.RegisterDirect<WindowBase, bool>(nameof(IsActive), o => o.IsActive);
             AvaloniaProperty.RegisterDirect<WindowBase, bool>(nameof(IsActive), o => o.IsActive);
 
 
         private bool _isActive;
         private bool _isActive;
+        private bool _ignoreVisibilityChange;
 
 
         static WindowBase()
         static WindowBase()
         {
         {
             IsVisibleProperty.OverrideDefaultValue<WindowBase>(false);
             IsVisibleProperty.OverrideDefaultValue<WindowBase>(false);
+            IsVisibleProperty.Changed.AddClassHandler<WindowBase>(x => x.IsVisibleChanged);
         }
         }
 
 
         public WindowBase(IWindowBaseImpl impl) : this(impl, AvaloniaLocator.Current)
         public WindowBase(IWindowBaseImpl impl) : this(impl, AvaloniaLocator.Current)
@@ -104,8 +106,17 @@ namespace Avalonia.Controls
         /// </summary>
         /// </summary>
         public virtual void Hide()
         public virtual void Hide()
         {
         {
-            PlatformImpl.Hide();
-            IsVisible = false;
+            _ignoreVisibilityChange = true;
+
+            try
+            {
+                PlatformImpl.Hide();
+                IsVisible = false;
+            }
+            finally
+            {
+                _ignoreVisibilityChange = false;
+            }
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -113,10 +124,19 @@ namespace Avalonia.Controls
         /// </summary>
         /// </summary>
         public virtual void Show()
         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;
+            }
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -164,8 +184,17 @@ namespace Avalonia.Controls
 
 
         protected override void HandleClosed()
         protected override void HandleClosed()
         {
         {
-            IsVisible = false;
-            base.HandleClosed();
+            _ignoreVisibilityChange = true;
+
+            try
+            {
+                IsVisible = false;
+                base.HandleClosed();
+            }
+            finally
+            {
+                _ignoreVisibilityChange = false;
+            }
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -222,6 +251,21 @@ namespace Avalonia.Controls
             Deactivated?.Invoke(this, EventArgs.Empty);
             Deactivated?.Invoke(this, EventArgs.Empty);
         }
         }
 
 
+        private void IsVisibleChanged(AvaloniaPropertyChangedEventArgs e)
+        {
+            if (!_ignoreVisibilityChange)
+            {
+                if ((bool)e.NewValue)
+                {
+                    Show();
+                }
+                else
+                {
+                    Hide();
+                }
+            }
+        }
+
         /// <summary>
         /// <summary>
         /// Starts moving a window with left button being held. Should be called from left mouse button press event handler
         /// Starts moving a window with left button being held. Should be called from left mouse button press event handler
         /// </summary>
         /// </summary>

+ 31 - 0
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<IPopupImpl>();
+            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<IPopupImpl>();
+            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<TestWindowBase> CreateTemplate()
         private FuncControlTemplate<TestWindowBase> CreateTemplate()
         {
         {
             return new FuncControlTemplate<TestWindowBase>(x =>
             return new FuncControlTemplate<TestWindowBase>(x =>