Browse Source

Fix SplitView :closed pseudoclass not being added on control initialization #17176 (#17178)

* test(SplitViewTests.cs): added failing test for issue #17176

* fix(SplitView.cs): added pane state pseudo class update in OnApplyTemplate

- fixed #17176

* test(SplitViewTests): added globalclock mock to failing test
release/11.2.0-rc1
Nikolai Naberezhnev 1 year ago
committed by GitHub
parent
commit
cd4315bf9e
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 23
      src/Avalonia.Controls/SplitView/SplitView.cs
  2. 27
      tests/Avalonia.Controls.UnitTests/SplitViewTests.cs

23
src/Avalonia.Controls/SplitView/SplitView.cs

@ -297,6 +297,7 @@ namespace Avalonia.Controls
_pane = e.NameScope.Find<Panel>("PART_PaneRoot");
UpdateVisualStateForDisplayMode(DisplayMode);
UpdatePaneStatePseudoClass(IsPaneOpen);
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
@ -331,19 +332,13 @@ namespace Avalonia.Controls
else if (change.Property == IsPaneOpenProperty)
{
bool isPaneOpen = change.GetNewValue<bool>();
UpdatePaneStatePseudoClass(isPaneOpen);
if (isPaneOpen)
{
PseudoClasses.Add(pcOpen);
PseudoClasses.Remove(pcClosed);
OnPaneOpened(new RoutedEventArgs(PaneOpenedEvent, this));
}
else
{
PseudoClasses.Add(pcClosed);
PseudoClasses.Remove(pcOpen);
OnPaneClosed(new RoutedEventArgs(PaneClosedEvent, this));
}
}
@ -579,6 +574,20 @@ namespace Avalonia.Controls
e.Handled = true;
}
private void UpdatePaneStatePseudoClass(bool isPaneOpen)
{
if (isPaneOpen)
{
PseudoClasses.Add(pcOpen);
PseudoClasses.Remove(pcClosed);
}
else
{
PseudoClasses.Add(pcClosed);
PseudoClasses.Remove(pcOpen);
}
}
/// <summary>
/// Coerces/validates the <see cref="IsPaneOpen"/> property value.
/// </summary>

27
tests/Avalonia.Controls.UnitTests/SplitViewTests.cs

@ -1,5 +1,7 @@
using Avalonia.Input;
using Avalonia.Animation;
using Avalonia.Input;
using Avalonia.UnitTests;
using Moq;
using Xunit;
namespace Avalonia.Controls.UnitTests
@ -65,7 +67,8 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void SplitView_TemplateSettings_Are_Correct_For_Display_Modes()
{
using var app = UnitTestApplication.Start(TestServices.StyledWindow);
using var app = UnitTestApplication.Start(TestServices.StyledWindow
.With(globalClock: new MockGlobalClock()));
var wnd = new Window
{
Width = 1280,
@ -280,5 +283,25 @@ namespace Avalonia.Controls.UnitTests
Assert.True(splitView.IsPaneOpen);
}
[Fact]
public void With_Default_IsPaneOpen_Value_Should_Have_Closed_Pseudo_Class_Set()
{
// Testing this control Pseudo Classes requires placing the SplitView on a window
// prior to asserting them, because some of the pseudo classes are set either when
// the template is applied or the control is attached to the visual tree
using var app = UnitTestApplication.Start(TestServices.StyledWindow
.With(globalClock: new MockGlobalClock()));
var wnd = new Window
{
Width = 1280,
Height = 720
};
var splitView = new SplitView();
wnd.Content = splitView;
wnd.Show();
Assert.Contains(splitView.Classes, ":closed".Equals);
}
}
}

Loading…
Cancel
Save