WinForms下如何实现Bing Maps截图复制到剪贴板及解决编译报错?
问题核心根源
你遇到的连续编译错误,本质是找到的Bing开发者博客参考代码是为UWP/WinUI运行环境设计的,依赖Windows Runtime(WinRT)系统API,而默认配置的WinForms项目并未开启这部分API的检索权限,才会先后出现找不到IRandomAccessStream、找不到Windows根命名空间的报错。
方案一:调整项目配置适配原有参考代码
如果你希望直接复用现成的参考代码,不需要替换实现逻辑,可以按照以下步骤修改项目配置:
- 若项目基于现代.NET(.NET 6/7/8)开发:
- 编辑项目的
.csproj文件,将目标框架从普通的netX.0-windows修改为带Windows 10版本标记的格式,例如net8.0-windows10.0.19041.0。这个改动会自动将所有Windows.*命名空间下的WinRT API纳入项目可引用范围,不需要手动添加零散的程序集引用。 - 确认项目属性中
UseWindowsForms配置已开启,保存配置后重新生成项目,using Windows.Storage.Streams;语句和IRandomAccessStream类型就能正常识别。
- 编辑项目的
- 若项目基于传统.NET Framework(4.5及以上版本)开发:
- 手动添加对
System.Runtime.WindowsRuntime程序集的引用,同时补充对系统自带WinRT运行时程序集的检索路径,才能正常加载Windows根命名空间下的类型。
- 手动添加对
补充提示:这套适配方案会为你的项目引入跨运行时的依赖,你找到的参考代码本身实现了地图截图导出、本地保存、跨应用分享等全量功能,其中涉及WinRT流操作的部分对你“仅需将截图复制到剪贴板”的需求是完全冗余的。
方案二:用WinForms原生API实现截图复制(更推荐)
完全不需要照搬原参考代码的复杂逻辑,WinForms自带的原生能力就可以流畅完成Bing Maps控件的截图复制功能,没有跨运行时兼容问题,实现步骤更简单:
- 获取Bing Maps控件的实际渲染尺寸,创建对应大小的内存
Bitmap对象 - 优先调用Bing Maps控件本身提供的渲染快照方法,直接生成位图内容;如果没有对应方法,可以用
Graphics.CopyFromScreen,结合控件的屏幕坐标把显示内容捕获到内存位图中 - 直接调用
Clipboard.SetImage(生成的位图对象),即可把截图写入系统剪贴板,整个过程不需要依赖任何WinRT类型,自然不会触发之前的编译报错。
注意:如果你的Bing Maps控件是通过ElementHost从WPF环境嵌入WinForms的,捕获截图时需要先换算控件的实际屏幕坐标,避免出现截图错位;这种场景下可以直接用WPF的
RenderTargetBitmap完成控件渲染捕获,再转成WinForms兼容的位图格式传入剪贴板即可。
内容的提问来源于stack exchange,提问作者B. Clay Shannon-B. Crow Raven
相关产品推荐
相关产品推荐

