首页 > 解决方案 > 如何将 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?

标签: c#wpfwinforms.net-5

解决方案


您写道您正在使用 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 的原因是什么,以上都可以做到。


推荐阅读