You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3全屏子窗口关闭问题:视频播放结束后无法正常关闭

WinUI3 全屏播放窗口无法正常关闭的解决方案

问题场景

开发全屏子窗口FullScreenPlayer用于播放视频,视频结束时通过MediaPlayer_MediaEnded事件调用Close()方法,仅出现窗口变黑但无法关闭的情况,尝试Win32的DestroyWindow API也无效。

解决方法

1. 确保在UI线程执行关闭操作

MediaPlayer.MediaEnded事件可能在后台线程触发,WinUI的窗口操作必须在UI线程中执行,需通过DispatcherQueue将关闭操作调度到UI线程。

2. 先退出全屏模式再关闭窗口

直接关闭全屏状态的窗口易引发渲染异常,需先切换回默认窗口展示器,再执行关闭操作。

修改后的代码示例

调整MediaPlayer_MediaEnded方法如下:

private void MediaPlayer_MediaEnded(MediaPlayer sender, object args)
{
    // 先退出全屏模式
    appWindow.SetPresenter(AppWindowPresenterKind.Default);
    
    // 调度到UI线程执行关闭
    DispatcherQueue.TryEnqueue(() =>
    {
        Close();
    });
}

额外验证点

  • 确认调用窗口的代码中,player变量是类级别的成员(而非局部变量),避免窗口实例被提前回收导致异常。
  • 若使用WinUIEx的WindowManager,可直接调用manager.Close()替代Close(),确保窗口管理逻辑统一:
    // 在构造函数中保留WindowManager引用
    private readonly WindowManager _manager;
    
    public FullScreenPlayer()
    {
        InitializeComponent();
        _manager = WindowManager.Get(this);
        appWindow = _manager.AppWindow;
        // 其他初始化代码...
    }
    
    private void MediaPlayer_MediaEnded(MediaPlayer sender, object args)
    {
        appWindow.SetPresenter(AppWindowPresenterKind.Default);
        DispatcherQueue.TryEnqueue(() =>
        {
            _manager.Close();
        });
    }
    

内容的提问来源于stack exchange,提问作者minato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:22:50