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
对我不起作用。我不确定根本原因。
我只是想改变 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
对我不起作用。我不确定根本原因。