Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<Page x:Class="UITests.Shared.Windows_UI_Xaml.EventTrigger_Loaded"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Page.Resources>
<Storyboard x:Name="FadeInStoryboard">
<DoubleAnimation Storyboard.TargetName="TargetBorder"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:1" />
</Storyboard>
</Page.Resources>

<Grid>
<Border x:Name="TargetBorder"
Width="200"
Height="200"
Background="{ThemeResource SystemAccentColorBrush}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Opacity="0">
<TextBlock Text="Fading In..."
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}" />

<Border.Triggers>
<EventTrigger>
<BeginStoryboard Storyboard="{StaticResource FadeInStoryboard}" />
</EventTrigger>
</Border.Triggers>
</Border>
</Grid>
</Page>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Microsoft.UI.Xaml.Controls;

namespace UITests.Shared.Windows_UI_Xaml
{
public sealed partial class EventTrigger_Loaded : Page
{
public EventTrigger_Loaded()
{
this.InitializeComponent();
}
}
}
176 changes: 176 additions & 0 deletions src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_EventTrigger.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
using System.Threading.Tasks;
using Private.Infrastructure;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media.Animation;

namespace Uno.UI.RuntimeTests.Tests.Windows_UI_Xaml;

[TestClass]
[RunsOnUIThread]
public class Given_EventTrigger
{
[TestMethod]
public async Task When_EventTrigger_With_BeginStoryboard_On_Loaded()
{
var grid = new Grid
{
Width = 100,
Height = 100
};

var border = new Border
{
Width = 50,
Height = 50,
Opacity = 0
};

// Create storyboard to animate opacity
var storyboard = new Storyboard();
var animation = new DoubleAnimation
{
From = 0,
To = 1,
Duration = new Duration(TimeSpan.FromMilliseconds(100))
};
Storyboard.SetTarget(animation, border);
Storyboard.SetTargetProperty(animation, "Opacity");
storyboard.Children.Add(animation);

// Create BeginStoryboard action
var beginStoryboard = new BeginStoryboard
{
Storyboard = storyboard
};

// Create EventTrigger
var eventTrigger = new EventTrigger();
eventTrigger.Actions.Add(beginStoryboard);

// Add trigger to border
border.Triggers.Add(eventTrigger);

grid.Children.Add(border);

// Add to visual tree
TestServices.WindowHelper.WindowContent = grid;
await TestServices.WindowHelper.WaitForLoaded(grid);
await TestServices.WindowHelper.WaitForIdle();

// Give the animation time to start and complete
await Task.Delay(200);

// Verify that the storyboard ran and opacity changed
Assert.AreEqual(1.0, border.Opacity, 0.01, "Border opacity should be 1 after storyboard completes");
}

[TestMethod]
public async Task When_EventTrigger_Without_RoutedEvent_Defaults_To_Loaded()
{
bool storyboardStarted = false;

var border = new Border
{
Width = 50,
Height = 50
};

// Create storyboard
var storyboard = new Storyboard();
storyboard.Completed += (s, e) => storyboardStarted = true;

// Create BeginStoryboard action
var beginStoryboard = new BeginStoryboard
{
Storyboard = storyboard
};

// Create EventTrigger without setting RoutedEvent
var eventTrigger = new EventTrigger();
eventTrigger.Actions.Add(beginStoryboard);

// Add trigger to border
border.Triggers.Add(eventTrigger);

// Add to visual tree
TestServices.WindowHelper.WindowContent = border;
await TestServices.WindowHelper.WaitForLoaded(border);
await TestServices.WindowHelper.WaitForIdle();

// Wait for storyboard to complete
await TestServices.WindowHelper.WaitFor(() => storyboardStarted);

Assert.IsTrue(storyboardStarted, "Storyboard should have started when element loaded");
}

[TestMethod]
public async Task When_Multiple_Actions_In_EventTrigger()
{
int action1Executed = 0;
int action2Executed = 0;

var border = new Border
{
Width = 50,
Height = 50
};

// Create first storyboard
var storyboard1 = new Storyboard();
storyboard1.Completed += (s, e) => action1Executed++;

// Create second storyboard
var storyboard2 = new Storyboard();
storyboard2.Completed += (s, e) => action2Executed++;

// Create BeginStoryboard actions
var beginStoryboard1 = new BeginStoryboard { Storyboard = storyboard1 };
var beginStoryboard2 = new BeginStoryboard { Storyboard = storyboard2 };

// Create EventTrigger with multiple actions
var eventTrigger = new EventTrigger();
eventTrigger.Actions.Add(beginStoryboard1);
eventTrigger.Actions.Add(beginStoryboard2);

// Add trigger to border
border.Triggers.Add(eventTrigger);

// Add to visual tree
TestServices.WindowHelper.WindowContent = border;
await TestServices.WindowHelper.WaitForLoaded(border);
await TestServices.WindowHelper.WaitForIdle();

// Wait for storyboards to complete
await TestServices.WindowHelper.WaitFor(() => action1Executed > 0 && action2Executed > 0);

Assert.AreEqual(1, action1Executed, "First storyboard should have executed");
Assert.AreEqual(1, action2Executed, "Second storyboard should have executed");
}

[TestMethod]
public void When_EventTrigger_With_Non_Loaded_Event_Throws()
{
var eventTrigger = new EventTrigger();

// Create a custom routed event (not Loaded)
var customEvent = new RoutedEvent(Uno.UI.Xaml.RoutedEventFlag.None, "CustomEvent");

// Attempting to set a non-Loaded RoutedEvent should throw
Assert.ThrowsException<NotSupportedException>(() =>
{
eventTrigger.RoutedEvent = customEvent;
}, "Setting a non-Loaded RoutedEvent should throw NotSupportedException");
}

[TestMethod]
public void When_EventTrigger_With_Loaded_Event_Succeeds()
{
var eventTrigger = new EventTrigger();

// Setting the Loaded event should succeed
eventTrigger.RoutedEvent = FrameworkElement.LoadedEvent;

Assert.AreEqual(FrameworkElement.LoadedEvent, eventTrigger.RoutedEvent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,14 @@
namespace Microsoft.UI.Xaml.Media.Animation
{
[global::Microsoft.UI.Xaml.Markup.ContentPropertyAttribute(Name = "Storyboard")]
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
#if false || false || false || false || false || false || false
[global::Uno.NotImplemented]
#endif
public partial class BeginStoryboard : global::Microsoft.UI.Xaml.TriggerAction
{
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public global::Microsoft.UI.Xaml.Media.Animation.Storyboard Storyboard
{
get
{
return (global::Microsoft.UI.Xaml.Media.Animation.Storyboard)this.GetValue(StoryboardProperty);
}
set
{
this.SetValue(StoryboardProperty, value);
}
}
#endif
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public static global::Microsoft.UI.Xaml.DependencyProperty StoryboardProperty { get; } =
Microsoft.UI.Xaml.DependencyProperty.Register(
nameof(Storyboard), typeof(global::Microsoft.UI.Xaml.Media.Animation.Storyboard),
typeof(global::Microsoft.UI.Xaml.Media.Animation.BeginStoryboard),
new Microsoft.UI.Xaml.FrameworkPropertyMetadata(default(global::Microsoft.UI.Xaml.Media.Animation.Storyboard)));
#endif
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public BeginStoryboard()
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Microsoft.UI.Xaml.Media.Animation.BeginStoryboard", "BeginStoryboard.BeginStoryboard()");
}
#endif
// Skipping already declared property Storyboard
// Skipping already declared property StoryboardProperty
// Skipping already declared method Microsoft.UI.Xaml.Media.Animation.BeginStoryboard.BeginStoryboard()
// Forced skipping of method Microsoft.UI.Xaml.Media.Animation.BeginStoryboard.BeginStoryboard()
// Forced skipping of method Microsoft.UI.Xaml.Media.Animation.BeginStoryboard.Storyboard.get
// Forced skipping of method Microsoft.UI.Xaml.Media.Animation.BeginStoryboard.Storyboard.set
Expand Down
36 changes: 4 additions & 32 deletions src/Uno.UI/Generated/3.0.0.0/Microsoft.UI.Xaml/EventTrigger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,14 @@
namespace Microsoft.UI.Xaml
{
[global::Microsoft.UI.Xaml.Markup.ContentPropertyAttribute(Name = "Actions")]
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
#if false || false || false || false || false || false || false
[global::Uno.NotImplemented]
#endif
public partial class EventTrigger : global::Microsoft.UI.Xaml.TriggerBase
{
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public global::Microsoft.UI.Xaml.RoutedEvent RoutedEvent
{
get
{
throw new global::System.NotImplementedException("The member RoutedEvent EventTrigger.RoutedEvent is not implemented. For more information, visit https://aka.platform.uno/notimplemented#m=RoutedEvent%20EventTrigger.RoutedEvent");
}
set
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Microsoft.UI.Xaml.EventTrigger", "RoutedEvent EventTrigger.RoutedEvent");
}
}
#endif
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public global::Microsoft.UI.Xaml.TriggerActionCollection Actions
{
get
{
throw new global::System.NotImplementedException("The member TriggerActionCollection EventTrigger.Actions is not implemented. For more information, visit https://aka.platform.uno/notimplemented#m=TriggerActionCollection%20EventTrigger.Actions");
}
}
#endif
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public EventTrigger()
{
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Microsoft.UI.Xaml.EventTrigger", "EventTrigger.EventTrigger()");
}
#endif
// Skipping already declared property RoutedEvent
// Skipping already declared property Actions
// Skipping already declared method Microsoft.UI.Xaml.EventTrigger.EventTrigger()
// Forced skipping of method Microsoft.UI.Xaml.EventTrigger.EventTrigger()
// Forced skipping of method Microsoft.UI.Xaml.EventTrigger.RoutedEvent.get
// Forced skipping of method Microsoft.UI.Xaml.EventTrigger.RoutedEvent.set
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,7 @@ public string Language
// Skipping already declared property BaseUri
// Skipping already declared property IsLoaded
// Skipping already declared property Parent
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public global::Microsoft.UI.Xaml.TriggerCollection Triggers
{
get
{
throw new global::System.NotImplementedException("The member TriggerCollection FrameworkElement.Triggers is not implemented. For more information, visit https://aka.platform.uno/notimplemented#m=TriggerCollection%20FrameworkElement.Triggers");
}
}
#endif
// Skipping already declared property Triggers
#if __ANDROID__ || __IOS__ || __TVOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "__TVOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
public static global::Microsoft.UI.Xaml.DependencyProperty ActualHeightProperty { get; } =
Expand Down
Loading
Loading