wpf 是否必须添加对WindowsBase.dll的引用才能使用RenderTargetBitmap.Render方法?

pkwftd7m  于 2022-12-14  发布在  Windows
关注(0)|答案(2)|浏览(285)

我目前正在开发一个WPF应用程序,它使用了一个名为Live Charts for WPF的绘图库。我想保存我的图形的PNG,这在他们的github页面Save Plot Example上有描述,也在这个stackoverflow问题here中讨论过。问题是添加了一个对windows基本程序集的引用。
`

private void SaveToPng(FrameworkElement visual, string filename)
{
    var encoder = new PngBitmapEncoder();
    EncodeVisual(visual, filename, encoder);
}

private static void EncodeVisual(FrameworkElement visual, string fileName, BitmapEncoder encoder)
{
    var bitmap = new RenderTargetBitmap((int)visual.ActualWidth, (int)visual.ActualHeight, 96, 96, PixelFormats.Pbgra32);
    //bitmap.Render();
    bitmap.Render(visual);
    var frame = BitmapFrame.Create(bitmap);
    encoder.Frames.Add(frame);
    using (var stream = File.Create(fileName)) encoder.Save(stream);
}

`
我曾尝试将此dll作为引用添加到C:\Program Files(x86)\Reference Assemblies\Microsoft\Framework\v3.0中,但当我这样做时,它不起作用。它实际上是隐式包含在项目中的,所以这可能就是为什么我可以像显式添加PresentationCore.dll和PresentationFramework.dll一样添加它,这两个文件也是必需的,并解决了一些错误。错误如下:类型“System.Windows.Freezable”是在未被引用的程序集中定义的。必须添加对程序集“WindowsBase,Version=3.0.0.0,Culture=neutral,PublicKeyToken= 31bf3856ad364e35”的引用。将鼠标悬停在对bitmap.Render(visual)的调用上即可显示这一点。当鼠标悬停在保存(stream)上时,如图片和上面的代码所示。我相信解决这个依赖关系会解决这个问题,但我不知道如何解决。谢谢。Picture of Project

4smxwvx5

4smxwvx51#

发现了我认为是问题答案的东西。我在WPF项目中使用的类库内部创建SaveToPNG和EncodeVisual方法。类库无法接受WindowsBase作为显式引用,但WPF项目本身可以。在WPF项目本身中实现这一点需要重新构建代码,但这似乎是解决此问题的方法。

uqzxnwby

uqzxnwby2#

我使用的是.NET 6。下面是类库中csproj文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
  <ItemGroup>
    <Compile Update="Core Library\Port.cs">
      <SubType>Component</SubType>
    </Compile>
  </ItemGroup>
</Project>

我没有看到您提到的属性,并且自动完成无法在此文件中引用它们。(Rider)我能够在项目的属性菜单中指向net6.0-windows。然后我将代码重新插入类库中,但仍然发生了同样的错误。我同意您的观点,即不应该有必要引用WindowsBase。这在将代码放在wpf项目本身中时是不必要的,但在类库中,我还必须引用PresentationCore和PresentationFramework,它们确实处理了多个错误。

相关问题