diff --git a/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_VisualStateManager.cs b/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_VisualStateManager.cs index 4c6567b05172..cde6ad0eaa23 100644 --- a/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_VisualStateManager.cs +++ b/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_VisualStateManager.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Windows.Foundation; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; @@ -8,6 +10,7 @@ using Microsoft.UI.Xaml.Shapes; using Microsoft.VisualStudio.TestTools.UnitTesting; using MUXControlsTestApp.Utilities; +using SamplesApp.UITests; using Uno.Extensions; using Uno.UI.Extensions; using Uno.UI.RuntimeTests.Helpers; @@ -79,4 +82,65 @@ public async Task SelectorItem_SelectedState() var states = VisualStateHelper.GetCurrentVisualStateName(container2).ToArray(); Assert.IsTrue(states.Contains("MultiSelectEnabled"), $"container2 is not in 'MultiSelectEnabled' state: states={states.JoinBy(",")}"); } + +#if HAS_UNO + [TestMethod] + [UnoWorkItem("https://github.com/unoplatform/uno/issues/19364")] + public async Task When_StateTriggers_Evaluated_Before_First_Layout() + { + MyUserControl uc = new MyUserControl(); + VisualStateManager.SetVisualStateGroups(uc, new List + { + new VisualStateGroup() + { + States = + { + new VisualState + { + Name = "MyVisualState1", + }, + new VisualState + { + Name = "MyVisualState2", + StateTriggers = + { + new AdaptiveTrigger() + { + MinWindowWidth = 1 + } + } + } + } + } + }); + + var contentControl = new ContentControl + { + Content = "0", + ContentTemplate = new DataTemplate(() => + { + return uc; + }) + }; + + await UITestHelper.Load(contentControl, control => control.IsLoaded); + Assert.AreEqual("MyVisualState2", uc.VisualStateOnFirstMeasure?.Name); + } + + private partial class MyUserControl : UserControl + { + private bool _firstMeasure = true; + public VisualState VisualStateOnFirstMeasure { get; set; } + + protected override Size MeasureOverride(Size availableSize) + { + if (_firstMeasure) + { + _firstMeasure = false; + VisualStateOnFirstMeasure = VisualStateManager.GetVisualStateGroups(this)[0].CurrentState; + } + return base.MeasureOverride(availableSize); + } + } +#endif }