在.NET Framework 4.0中, 这仍然是一个已知的问题,微软描述为"当WPF和底层的WMP控件之间需要重新同步时,会发生显示更改"。这种情况发生在 H.264 编解码视频文件中。
以下是三种解决方法:
1. 对包含 MediaElement 控件的窗口使用软件渲染
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var hwndSource = PresentationSource.FromVisual(this) as HwndSource;
if (hwndSource != null)
{
var hwndTarget = hwndSource.CompositionTarget;
if (hwndTarget != null) hwndTarget.RenderMode = RenderMode.SoftwareOnly;
}
}
然而,这并没有使用GPU和显存,可能会减慢视频播放速度。
2. 将至少1个像素重叠到主显示器上
例如,假设主屏幕在左侧,而MediaElement填充整个窗口。在窗口的构造函数中,假设Rect bounds表示辅助监视器的边界,请使用。
this.Left = bounds.Left - 1;
this.Width = bounds.Width;
this.Top = bounds.Top;
this.Height = bounds.Height;
所以,MediaElement在主监视器上有1个像素的重叠,并且它能够正常播放H.264视频文件。
3. 使用除微软媒体基础编解码器之外的其他MP4编解码器
下载一个名为“Win7DSFilterTweaker”的工具来禁用Media Foundation的“MP4”播放。
安装另一个MP4编解码器,例如ffshow。