WPF实现投屏功能时遇‘无法创建新视图,主窗口未创建’错误求助
问题描述
我需要创建一个WPF应用实现投屏功能,参考微软官方UWP投影示例,尝试将其转换为WPF应用(代码仓库:MirrorCastDemo)。主要修改UI部分,用MainWindow(Window)替代原示例的MainPage(Page),也曾尝试沿用MainPage(Page),但仍出现相同错误。
运行应用时收到错误提示:
Could not create a new view because the main window has not yet been created
困惑于错误中的“主窗口”所指:StartProjecting()方法属于Scenario3.xaml.cs,且是通过点击已创建的MainWindow上的按钮导航到Scenario3页面的,导航代码如下:
private void Button_Click(object sender, RoutedEventArgs e) { Scenario3 scenario3 = new Scenario3(); ScenarioFrame.Navigate(scenario3); }
请问问题出在哪里?
问题分析与解决
核心原因
错误里的“主窗口”并非你创建的WPF MainWindow,而是UWP框架层面的核心应用窗口。原UWP投影示例依赖的ApplicationViewSwitcher.StartProjecting等API是UWP专属的多视图机制,这类API要求UWP应用的核心上下文(包括主应用视图)已经完成初始化,但WPF应用的窗口模型和UWP完全不同,没有UWP的ApplicationView主视图上下文,所以调用时会报错。
解决方向
- 替换为WPF兼容的投屏API:放弃复用UWP的多视图逻辑,改用Windows.Media.Casting命名空间下的WinRT API(可在WPF中通过NuGet引入WinRT包调用)。具体步骤包括:
- 使用
CastDevicePicker让用户选择投屏设备 - 将WPF窗口的内容转换为可投射的媒体源(比如通过
RenderTargetBitmap捕获窗口帧,再封装成MediaStreamSource) - 建立与投屏设备的连接并推送媒体流
- 使用
- 避免直接复用UWP专属代码:原示例中
StartProjecting依赖的ApplicationView.GetForCurrentView()、ApplicationViewSwitcher都是UWP独有的API,WPF中没有对应实现,强行移植必然出现上下文缺失的错误。
内容的提问来源于stack exchange,提问作者Tom Xue
相关产品推荐
相关产品推荐

