【问题标题】:How to add WPF support to .NET 5 Winforms project如何将 WPF 支持添加到 .NET 5 Winforms 项目
【发布时间】:2020-11-12 00:53:23
【问题描述】:

我正在将旧的 .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?

【问题讨论】:

  • var bitmap = (Bitmap)Image.FromStream(new MemoryStream(rawData), true);。还是您有充分的理由在 WinForms 中使用 BitmapSource?
  • 这是来自 DICOM .dcm 文件的字节部分,可以是 JPG 或 BMP 格式。当时,拥有 2 种不同的方法(BMP 的简单方法和 JPG 专用的方法)似乎是解码它的唯一方法。你是说 Image.FromStream() 会正确处理这个,无论字节流是什么格式?
  • 是的,它使用从源 Bitmap 标头派生的内部解码器生成一个 Bitmap(当然,如果支持 Image 格式)。如果你的 DICOM 是 16 位灰度图像,那当然不行。
  • 顺便说一句,将此信息添加到问题中,它可能对其他人更有用。如果 GDI+ 不支持 DICOM 格式,这就是首先使用 BitmatSource 的原因,那么其他人可以找到此信息。
  • Jimi,DICOM 是文件格式,不是图像格式,所以不是 GDI+ 的问题。它确实包含可以采用各种格式的图像,这就是我遇到的地方。正如我在下面提到的,这是继承的代码。我应该解决这个问题,只使用 GDI+,现在使用 WPF。

标签: c# wpf winforms .net-5


【解决方案1】:

您写道您正在使用 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>元素中。 p>

完成后,项目文件可能如下所示:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

</Project>

此时,项目的“Dependencies”“Frameworks”项下的条目“Microsoft.WindowsDesktop.App.WindowsForms” > WPF 库应更改为“Microsoft.WindowsDesktop.App”,并将包含您需要的 Winforms 和 WPF 库。

您也可以采用其他方式,将 Winforms 支持添加到现有 WPF 项目中,只需添加 &lt;UseWindowsForms/&gt; 元素即可。

当然,这一切都引出了一个问题,为什么您不只使用 GDI+ 图像处理类型。 Winforms 可以像 WPF 一样加载 JPEG 文件,所以你为什么要依赖 WPF 还不清楚。但也有其他原因可以混搭。无论您想在 .NET 5 项目中结合 Winforms 和 WPF 的原因是什么,以上都可以做到。

【讨论】:

    【解决方案2】:

    我找到了答案。显然,我必须在项目文件中添加一个 UseWPF 项,因为 PresentationCore 确实是一个 WPF 库。这样做可以解决问题。

    【讨论】:

    • 这是堆栈溢出.....它可以回答你自己的问题,当回答你自己的问题时让它像一个正常的答案......即,放弃“没关系”重点是其他人可能会找到有用的答案! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多