c# - 如何将 WPF 支持添加到 .NET 5 Winforms 项目
问题描述
我正在将旧的 .NET Framework 4 WinForms 应用程序转换为 .NET 5。在这种情况下,最简单的方法是重新创建项目,该项目大部分都有效。但是,我有一种方法可以从内存流中解码 JPG 图像:
// Look for JFIF header
MemoryStream memStream = new MemoryStream( rawData );
JpegBitmapDecoder decoder = new JpegBitmapDecoder( memStream,
BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default );
BitmapSource bmpSource = decoder.Frames[0];
Bitmap bitmap = new Bitmap( bmpSource.PixelWidth, bmpSource.PixelHeight,
PixelFormat.Format24bppRgb );
这失败了,因为 VS 2019 抱怨“使用 System.Windows.Media.Imaging”会导致错误,并且 JpegBitmapDecoder 显示为红色波浪线。如果我将鼠标悬停在 JpegBitmapDecoder 上,我可以选择“使用 System.Windows.Media.Imaging;来自 PresentationCode”。
但是,选择该选项会导致 VS 2019 卡在“执行建议的操作”上,尝试添加使用。
该项目针对 .NET 5,并且我添加了 Microsoft.Windows.Compatibility NuGet 包,那么我做错了什么?或者,我如何访问 JpegBitmapDecoder?
解决方案
您写道您正在使用 Visual Studio 2019(例如版本 16.7.6)。但是,据我所知,.NET 5 项目仅在 Visual Studio 2019 预览版(即 16.8.0 版预览版)中受支持。
注意:.NET 5 项目仅在 Visual Studio 2019 和更高版本的 16.8.0 版本中受支持(我只是意识到“预览”已使其进入发布状态)。
当我尝试在 Visual Studio 2019 Preview 中重现您的问题时,我遇到了一个稍微不同的问题:当我选择“使用 System.Windows.Media.Imaging;来自 PresentationCode”菜单项时,会显示一个进度对话框:
这个对话似乎永远持续下去。Visual Studio 似乎从未真正完成该操作。
所以这部分功能似乎被破坏了。但是,幸运的是,您可以手动执行 Visual Studio 应该为您完成的相同操作。只需选择项目,然后从“项目”菜单中选择“编辑项目文件”,并添加到主项目元素。<UseWPF>true</UseWPF>
<PropertyGroup>
完成后,项目文件可能如下所示:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<UseWPF>true</UseWPF>
</PropertyGroup>
</Project>
此时,项目的“依赖项” WPF 库中“框架”项下的条目“Microsoft.WindowsDesktop.App.WindowsForms”应更改为“Microsoft.WindowsDesktop.App”,并将包含您创建的 Winforms 和 WPF 库需要。
您也可以采用另一种方式,将 Winforms 支持添加到现有 WPF 项目中,只需添加<UseWindowsForms/>
元素即可。
当然,这一切都引出了一个问题,为什么您不只使用 GDI+ 图像处理类型。Winforms 可以像 WPF 一样加载 JPEG 文件,所以你为什么要依赖 WPF 还不清楚。但也有其他原因可以混搭。无论您想在 .NET 5 项目中结合 Winforms 和 WPF 的原因是什么,以上都可以做到。
推荐阅读
- visual-studio-code - 用于快速翻译不同语言文档的扩展悬停在 VSCode 中
- assembly - x86 程序集:对输入值求和然后对它们进行平均的程序在尝试访问不可访问的内存位置后崩溃
- php - Laravel Blade 组件 - UTF-8 编码问题
- javascript - 如何在每个日志之间设置带有暂停的循环
- node.js - 如何在开发模式下在下一个 js 自定义服务器中运行 websocket 服务器
- continuous-integration - ubuntu-latest 对 GitHub Actions 意味着什么?
- php - Webhook laravel 报错 spatie(签名无效)
- azure-sql-database - 弹性池中的 Azure 已用 Vs 已分配 Vs 最大值
- android - Bluetooth Discovery 检测到少数设备
- apache-spark - Livy Spark 提交 - 类