如何在XAML中无限播放GIF?

问题描述 投票:0回答:1

我的问题是,在我的代码中,GIF 播放一次,然后就卡住了。我已经尝试了各种方法来解决这个问题,但不幸的是没有任何帮助。 我尝试停止它,然后将其设置为零位置并再次播放。再次声明 GIF 为来源并没有帮助。唯一有效的是将源设置为 $null,然后再次设置源。然而,这会产生非常难看的闪烁效果。 这是我当前的代码:

function Get-Controls
{
    # Find and assign various UI controls from the loaded XAML window by their names

    $global:Load_Installing_lbl = $global:window.FindName("Installing_lbl")
    $global:Load_Loader_gpl = $global:window.FindName("Loader_gpl")

    $global:LoaderNum = 1
    $Load_Loader_gpl.Source = [Uri]::new("$PSScriptRoot\Loaders\Loader ($global:LoaderNum).gif")

    $global:Load_Loader_gpl.Add_MouseLeftButtonDown({
        $global:LoaderNum++
        if (-not (Test-Path "$PSScriptRoot\Loaders\Loader ($global:LoaderNum).gif"))
        {
            $global:LoaderNum = 1
        }

        # Reset the loader to ensure the new GIF will play infinitely
        $Load_Loader_gpl.Stop()
        $Load_Loader_gpl.Source = [Uri]::new("$PSScriptRoot\Loaders\Loader ($global:LoaderNum).gif")
        $Load_Loader_gpl.Play()
    })

    $Load_Loader_gpl.add_MediaEnded({
        $wert = [Environment]::GetEnvironmentVariable("Installation", "User")
        if ($wert -eq "FINISH")
        {
            [Environment]::SetEnvironmentVariable("Installation", $null, "User")
            $global:Window.Close()
        }
        else
        {
            # Temporarily set the source to null to reset the GIF
            $Load_Loader_gpl.Stop()
            $Load_Loader_gpl.Position = [TimeSpan]::Zero # Set the initial position to zero
            Write-Host "t0.20"
            $Load_Loader_gpl.Play()
        }
    })

    # Ensure the GIF plays in an endless loop initially
    $Load_Loader_gpl.Position = [TimeSpan]::Zero # Set the initial position to zero
    $Load_Loader_gpl.Play()
}
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow" Height="300" Width="300" WindowStyle="None" AllowsTransparency="True" Background="Transparent">
    <Border CornerRadius="0, 20, 0, 20" Background="LightGray" BorderBrush="#FFFDC400" BorderThickness="5">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Label Name="Installing_lbl" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" FontSize="24">Installing Test....</Label>
            <MediaElement Width="200" Height="200" Grid.Row="1" Margin="10" Name="Loader_gpl" LoadedBehavior="Manual" UnloadedBehavior="Stop">
            </MediaElement>
        </Grid>
    </Border>
</Window>

如上所述,我尝试使用 XAML 和 Powershell 无限播放 GIF。

powershell xaml gif animated-gif
1个回答
0
投票

PlayLORD-SysOp 值得赞扬的是他对 此相关答案的评论;自 .NET 8 起:

  • 再次调用

    .Position
    之前将
    [TimeSpan]::Zero
    属性重置为
    .Play()
    不起作用,但
    [TimeSpan]::FromMilliseconds(1)
    - 特别是 - 可以。

  • 如何:重复媒体播放中的信息不适用 - 大概它仅适用于始终“移动”媒体,例如声音和视频文件。

$Load_Loader_gpl.add_MediaEnded({
  # ... (conditional code omitted)
  # Restart the animated GIF.
  $this.Position = [TimeSpan]::FromMilliseconds(1)
  $this.Play()
})
© www.soinside.com 2019 - 2024. All rights reserved.