Skip to content

Fix AnimationCompleted event not firing with EventToCommandBehavior#336

Draft
Copilot wants to merge 3 commits intomainfrom
copilot/fix-lottie-animation-completion
Draft

Fix AnimationCompleted event not firing with EventToCommandBehavior#336
Copilot wants to merge 3 commits intomainfrom
copilot/fix-lottie-animation-completion

Conversation

Copy link
Contributor

Copilot AI commented Feb 5, 2026

SKLottieView.AnimationCompleted event fails to trigger when used with EventToCommandBehavior in MVVM scenarios:

<skia:SKLottieView Source="wait.json">
    <skia:SKLottieView.Behaviors>
        <toolkit:EventToCommandBehavior
            Command="{Binding NavigateCommand}"
            EventName="AnimationCompleted" />
    </skia:SKLottieView.Behaviors>
</skia:SKLottieView>

Changes

  • Async event dispatch: Wrap event invocation in Dispatcher.Dispatch() to avoid conflicts when handlers perform UI operations during property change notifications
  • Single-fire guarantee: Add animationCompletedFired flag to ensure event fires once per completion, reset on animation restart/repeat/reload
  • Test infrastructure: Update SKLottieViewTest to inherit from DispatchingBaseTest for mock dispatcher support

Implementation

// Before
if (IsComplete)
    AnimationCompleted?.Invoke(this, EventArgs.Empty);

// After  
if (IsComplete && !animationCompletedFired)
{
    animationCompletedFired = true;
    Dispatcher.Dispatch(() => AnimationCompleted?.Invoke(this, EventArgs.Empty));
}

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 0t3vsblobprodcus362.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/SkiaSharp.Extended/source/SkiaSharp.Extended/SkiaSharp.Extended.csproj --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • 1s1vsblobprodcus386.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/8E0510E7BE57D5CDD12984F1A8B1B374/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/5B74F40C93A078C72D8DF238B871667A/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 2zrvsblobprodcus388.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet workload install maui-android (dns block)
  • 4m6vsblobprodcus384.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet workload install maui-android (dns block)
  • 7k6vsblobprodcus337.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/169BD6A679E70F1A8DB1754AF220F794/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • bcnvsblobprodcus378.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet test tests/SkiaSharp.Extended.UI.Maui.Tests/SkiaSharp.Extended.UI.Maui.Tests.csproj --filter FullyQualifiedName~SKLottieViewTest --logger console;verbosity=detailed (dns block)
    • Triggering command: /usr/bin/dotnet dotnet build source/SkiaSharp.Extended.UI.Maui/SkiaSharp.Extended.UI.Maui.csproj -f net9.0-android35.0 (dns block)
    • Triggering command: /usr/bin/dotnet dotnet workload install maui-android (dns block)
  • c78vsblobprodcus322.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet workload install maui-android (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/SkiaSharp.Extended/tests/SkiaSharp.Extended.Tests/SkiaSharp.Extended.Tests.csproj --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/38137712C671CCEA0DDC198C705E19A0/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • e7bvsblobprodcus348.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/A444A7F4B86F65D3F2A7BCF8163D0596/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • fdpvsblobprodcus345.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/5707D9CCD3909344C2384588AB311A3D/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • frdvsblobprodcus327.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/SkiaSharp.Extended/tests/SkiaSharp.Extended.Tests/SkiaSharp.Extended.Tests.csproj --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/CB9CBA9383D5A238E2B9DD721B214239/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • i1qvsblobprodcus353.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/78EB6D0660D838F92C07DD472AF09142/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • imzvsblobprodcus368.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/D209161F91CDA5622BE85E6A2020A99D/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • kgfvsblobprodcus314.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/5B74F40C93A078C72D8DF238B871667A/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • kxqvsblobprodcus376.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/5B74F40C93A078C72D8DF238B871667A/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • lylvsblobprodcus31.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/SkiaSharp.Extended/tests/SkiaSharp.Extended.Tests/SkiaSharp.Extended.Tests.csproj --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • m16vsblobprodcus374.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/17F5F6D9D2176E6846B1D7AA9CBB2984/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • o3svsblobprodcus318.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet workload install maui-android (dns block)
  • pdfvsblobprodcus380.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/91EEECFC80ED8D6FF706082129E4975F/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • pe3vsblobprodcus354.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/78EB6D0660D838F92C07DD472AF09142/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • rcxvsblobprodcus328.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/SkiaSharp.Extended/tests/SkiaSharp.Extended.Tests/SkiaSharp.Extended.Tests.csproj --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/97B6F2CA4656254F7A852783585D5FF8/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • st8vsblobprodcus339.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/A3667232A3D22B710FDE080B34BE347F/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • u6ovsblobprodcus377.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/SkiaSharp.Extended/source/SkiaSharp.Extended/SkiaSharp.Extended.csproj --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/D0CE446A70B8C279207B5D1C384112D1/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • uy6vsblobprodcus34.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/78EB6D0660D838F92C07DD472AF09142/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • v53vsblobprodcus320.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/5B74F40C93A078C72D8DF238B871667A/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • x3yvsblobprodcus370.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/78EB6D0660D838F92C07DD472AF09142/missingpackages_workingdir --packages /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/SkiaSharp.Extended/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>[BUG] Lotie Animation Completed does not work</issue_title>
<issue_description>Description

I am using mvvm to navigate when the animation is completed and does not work

Code

<skia:SKLottieView AnimationCompleted="SKLottieView_AnimationCompleted" Source="wait.json"> <skia:SKLottieView.Behaviors> <toolkit:EventToCommandBehavior Command="{Binding CheckAuthCommand}" EventName="AnimationCompleted" /> </skia:SKLottieView.Behaviors>

`public partial class WelcomePageViewModel : ObservableObject {

[RelayCommand]
async Task CheckAuth() {
    await Shell.Current.GoToAsync($"//{nameof(LoginPage)}");
}

}
`

Expected Behavior

To be able no navigate

Actual Behavior

does not trigger

Basic Information

VS 2022
.Net 9
Android
Lotie package 2.0

Detailed IDE/OS information (click to expand)

PASTE ANY DETAILED VERSION INFO HERE

2.0.0

Screenshots

Reproduction Link

https://github.com/eduardoagr/MauiSamples

</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 2 commits February 5, 2026 03:17
Co-authored-by: mattleibow <1096616+mattleibow@users.noreply.github.com>
Co-authored-by: mattleibow <1096616+mattleibow@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix Lottie Animation completed event not triggering Fix AnimationCompleted event not firing with EventToCommandBehavior Feb 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Lotie Animation Completed does not work

2 participants