Browse Source

Make WindowBase.IsVisible show/hide window.

pull/935/head
Steven Kirk 10 years ago
parent
commit
e9968a7606
  1. 60
      src/Avalonia.Controls/WindowBase.cs
  2. 31
      tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs

60
src/Avalonia.Controls/WindowBase.cs

@ -29,10 +29,12 @@ namespace Avalonia.Controls
AvaloniaProperty.RegisterDirect<WindowBase, bool>(nameof(IsActive), o => o.IsActive);
private bool _isActive;
private bool _ignoreVisibilityChange;
static WindowBase()
{
IsVisibleProperty.OverrideDefaultValue<WindowBase>(false);
IsVisibleProperty.Changed.AddClassHandler<WindowBase>(x => x.IsVisibleChanged);
}
public WindowBase(IWindowBaseImpl impl) : this(impl, AvaloniaLocator.Current)
@ -104,8 +106,17 @@ namespace Avalonia.Controls
/// </summary>
public virtual void Hide()
{
PlatformImpl.Hide();
IsVisible = false;
_ignoreVisibilityChange = true;
try
{
PlatformImpl.Hide();
IsVisible = false;
}
finally
{
_ignoreVisibilityChange = false;
}
}
/// <summary>
@ -113,10 +124,19 @@ namespace Avalonia.Controls
/// </summary>
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>
@ -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;
}
}
/// <summary>
@ -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();
}
}
}
/// <summary>
/// Starts moving a window with left button being held. Should be called from left mouse button press event handler
/// </summary>

31
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()
{
return new FuncControlTemplate<TestWindowBase>(x =>

Loading…
Cancel
Save