C# gif medialement 如何改变位置

C# gif medialement how to change position

我只是想改变 gif 在 MediaElement 中的位置,所以当我没有用鼠标悬停它时它应该显示 GIF 的某个图像(所选位置)以及何时我将光标移到 MediaElement GIF 应该从位置零开始播放。但是我根本无法改变GIF的位置。

它开始播放,我可以暂停它,但是设置位置和stop()方法根本没有影响。


XAML代码:

<MediaElement x:Name="mediaElement" Source="C:\temp\smartGif.gif"
         ScrubbingEnabled="True" Loaded="mediaElement_Loaded" 
         MouseLeave="mediaElement_MouseLeave" 
         MouseEnter="mediaElement_MouseEnter" 
         LoadedBehavior="Manual" 
         HorizontalAlignment="Left" 
         Height="600" 
         Width="800" 
         VerticalAlignment="Top"/>

基本代码:

public UserWindow()
{
    InitializeComponent();
}

private void mediaElement_Loaded(object sender, RoutedEventArgs e)
{
    mediaElement.Play();
    mediaElement.Position = TimeSpan.FromMilliseconds(100);
    mediaElement.Pause();
}

private void mediaElement_MouseEnter(object sender, MouseEventArgs e)
{
    mediaElement.Play();
    mediaElement.Position = TimeSpan.Zero;
}

private void mediaElement_MouseLeave(object sender, MouseEventArgs e)
{
    mediaElement.Position = TimeSpan.FromMilliseconds(100);
    mediaElement.Pause();
}

是不是MediaElement要玩可以换位置?


更改:按照建议我添加了这个:

MediaFailed="mediaElement_MediaFailed"

还有那个:

    private void mediaElement_MediaFailed(object sender, ExceptionRoutedEventArgs e)
    {
        MessageBox.Show("failed");
    }

但是没有显示出来,不知道怎么办。 gif 是否可以正常工作或者是什么原因造成的?我是否需要以特殊方式下载 gif 以确保它支持正常功能?我用不同的 gif 试了一下,还是不行。

令人惊讶的是,互联网上还没有人报道过这一点,而且很多人都说它可以工作,但实际上不可能在 MediaElement 中更改 gif 运行 的位置。正常方法在我的问题上面,例如适用于 *.mp4,但不适用于 gif。为了让您信服,请尝试在 Windows 媒体播放器中播放 gif。由于 MediaElement 非常薄地包裹在 Windows Media Player 周围,您将看到相同的结果,更改位置被禁用。

有一种非常丑陋的方法可以重置 gif 以从头开始播放它,但如果您有其他选择,我不建议使用它。这可以应用于任何 event/trigger.

private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
    if (mediaElement.Source.ToString() == "file:///C:/temp/newGif1.gif")
    {
        mediaElement.Source = new Uri("C:\temp\newGif.gif");
        mediaElement.Play();
    }

    else
    {
        mediaElement.Source = new Uri("C:\temp\newGif1.gif");
        mediaElement.Play();
    }
}

唯一的方法是重置源以从头开始启动 gif,但您需要 gif 的副本,因为如果它是相同的源,则 MediaElement 将不会更新源。一般来说,当您为 MediaElement 设置源时,您必须设置完整路径。在XAML你可以从你电脑上的任何地方选择gif,它不需要在你的项目中设置为资源。

但是在普通代码中设置源,需要在项目中将gif设置为资源。所以通常它不像示例中那样是临时的,而是像 C:\Users\UnknownUser\Documents\Visual Studio 2015\Projects\RandomTestProject\Ressources.

如果您不依赖于使用 gif,我建议您使用 *.mp4,因为它更容易处理并且可以按预期方式工作,并且您可以轻松地将 *.gif 转换为 *.mp4。

这不是理想的解决方案,但我发现您可以通过订阅 MediaEnded 事件并设置 Position 属性 来循环播放 .gif 图像TimeSpan.FromMilliseconds(1) 然后调用 Play 方法。

例如

// Subscribe to the event
mediaElement.MediaEnded += mediaElement_MediaEnded;
private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
    // set the `Position` property to a 1ms `TimeSpan` and `Play`
    mediaElement.Position = TimeSpan.FromMilliseconds(1);
    mediaElement.Play();
}

TimeSpan 设置为 0 后调用 Play 对我不起作用。我不确定根本原因。