C# gif medialement如何改变位置

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

我只是想改变GIF在

MediaElement
中的位置,所以当我不用鼠标悬停它时,它应该显示GIF的某个图像(所选位置),当我将光标移动到
MediaElement
GIF 应从位置 0 开始播放。但我根本无法改变 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 尝试过,但仍然不起作用。

c# .net wpf mediaelement
3个回答
0
投票

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

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

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设置为项目中的资源。所以通常它不是像示例中那样的 temp 而是类似的东西

C:\Users\UnknownUser\Documents\Visual Studio 2015\Projects\RandomTestProject\Ressources

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


0
投票

这不是理想的解决方案,但我发现您可以通过订阅

.gif
事件并将
MediaEnded
属性设置为
Position
然后调用
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();
}

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


0
投票

这似乎适用于 gif。但我无法异步执行此操作。

    private void CloseImageMediaElement_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {

        ((MediaElement)sender).Stop();
        ((MediaElement)sender).Play();
        Task.Delay(10).Wait();
        ((MediaElement)sender).Pause();
    }

    private void CloseImageMediaElement_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        ((MediaElement)sender).Play();

    }
    private void CloseImageMediaElement_Loaded(object sender, RoutedEventArgs e)
    {
        ((MediaElement)sender).Play();
        Task.Delay(10).Wait();
        ((MediaElement)sender).Pause();
    }
© www.soinside.com 2019 - 2024. All rights reserved.