我目前正在开发一个WPF应用程序,它使用了一个名为Live Charts的WPF绘图库。我想保存我的图形的PNG,这是在他们的github页面上描述的,保存图的例子也在这个stackoverflow问题中讨论过。问题是添加对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 AssembliesMicrosoftFrameworkv3.0的参考,但当我这样做时,它不起作用。它实际上隐式地包含在项目中,所以这可能就是为什么我可以像使用PresentationCore.dll和PresentationFramework.dll那样显式地添加它,这也是必需的,并解决了一些错误。错误提示:类型为"System.Windows。"在未引用的程序集中定义了"可冻结"。您必须添加对程序集"WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"的引用。将鼠标悬停在bitmap.Render(visual)的调用上,以及将鼠标悬停在encoder.Save(stream)的调用上,如图和上面的代码所示。我相信解决这个依赖会解决问题,但我不知道如何解决。谢谢你!项目图片
找到了我认为是问题的答案。我正在类库中创建SaveToPNG和EncodeVisual方法,这些方法将在WPF项目中使用。类库不能接受WindowsBase作为显式引用,但WPF项目本身可以。要在WPF项目中实现这一点,需要对代码进行一些重组,但这似乎是解决这个问题的方法。
我正在使用。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 LibraryPort.cs">
<SubType>Component</SubType>
</Compile>
</ItemGroup>
</Project>
我没有看到您所说的属性,并且自动完成无法在此文件中引用它们。在IDE (Rider)内部,我能够在项目的属性菜单中针对net6.0-windows。然后我将代码重新插入到类库中,但仍然发生了相同的错误。我同意你的观点,没有必要引用WindowsBase,当把代码放在wpf项目本身时,这是没有必要的,但在类库中,我还必须引用PresentationCore和PresentationFramework,它们确实处理了多个错误。