我只是想改变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 尝试过,但仍然不起作用。
令人惊讶的是,互联网上还没有人报告这一点,而且很多人都说它有效,但实际上不可能更改在 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。
这不是理想的解决方案,但我发现您可以通过订阅
.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
对我来说不起作用。我不确定根本原因。
这似乎适用于 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();
}