C# WinForms集成XAML窗口实现Windows.Media.Playback视频显示问题
在WinForms中解决Windows.Media.Playback仅播放声音无画面的问题
问题分析
你当前的代码使用Windows.Media.Playback.MediaPlayer仅能播放声音,是因为这个类仅负责媒体播放的逻辑处理,没有自带的视频渲染界面。要显示画面,必须将它关联到MediaPlayerElement(XAML控件),再通过WinForms的ElementHost控件将XAML控件嵌入到WinForms窗体中。
解决步骤
1. 安装必要的NuGet包
右键项目 -> 管理NuGet程序包,搜索并安装Microsoft.UI.Xaml,这是在WinForms中使用WinUI XAML控件的基础依赖。
2. 在Form中添加ElementHost控件
打开Form的设计视图,在工具箱的「WPF Interop」分组里找到ElementHost控件,拖放到Form上,调整它的大小和位置(比如设置为铺满整个Form或者指定播放区域)。
3. 修改代码,关联MediaPlayer和MediaPlayerElement
更新你的Form代码如下:
using Windows.Media.Core; using Windows.Media.Playback; using Microsoft.UI.Xaml.Controls; using System.Windows.Forms.Integration; public partial class Form1 : Form { private MediaPlayer _mediaPlayer; private MediaPlayerElement _mediaPlayerElement; private ElementHost _elementHost; public Form1() { InitializeComponent(); // 初始化ElementHost(如果是设计时拖放的,直接用设计生成的实例即可) _elementHost = new ElementHost(); _elementHost.Dock = DockStyle.Fill; this.Controls.Add(_elementHost); // 初始化MediaPlayer _mediaPlayer = new MediaPlayer(); _mediaPlayer.MediaFailed += MediaPlayer_MediaFailed; // 初始化MediaPlayerElement并关联MediaPlayer _mediaPlayerElement = new MediaPlayerElement(); _mediaPlayerElement.MediaPlayer = _mediaPlayer; _mediaPlayerElement.AreTransportControlsEnabled = true; // 可选:显示播放控制条 // 将MediaPlayerElement设置为ElementHost的子控件 _elementHost.Child = _mediaPlayerElement; } private void MediaPlayer_MediaFailed(MediaPlayer sender, MediaPlayerFailedEventArgs args) { MessageBox.Show(args.ErrorMessage, "播放错误"); } private void button1_Click(object sender, EventArgs e) { _mediaPlayer.Source = MediaSource.CreateFromUri(new Uri("C:/sfc.mp4")); _mediaPlayer.Play(); // 建议移除测试用的MessageBox,避免阻塞UI线程影响播放渲染 // MessageBox.Show(_mediaPlayer.CurrentState.ToString(), "播放器状态"); } }
4. 注意事项
- 确保项目目标框架为.NET 6及以上(WinUI 3对框架版本有要求)。
- 检查视频编码是否被支持(
Windows.Media.Playback原生支持H.264等常见MP4编码)。 - 避免用
MessageBox这类阻塞UI线程的操作,否则会干扰媒体播放的初始化和画面渲染。
内容的提问来源于stack exchange,提问作者The amateur programmer
相关产品推荐
相关产品推荐

