我目前正在开发一个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
2条答案
按热度按时间4smxwvx51#
发现了我认为是问题答案的东西。我在WPF项目中使用的类库内部创建SaveToPNG和EncodeVisual方法。类库无法接受WindowsBase作为显式引用,但WPF项目本身可以。在WPF项目本身中实现这一点需要重新构建代码,但这似乎是解决此问题的方法。
uqzxnwby2#
我使用的是.NET 6。下面是类库中csproj文件的内容:
我没有看到您提到的属性,并且自动完成无法在此文件中引用它们。(Rider)我能够在项目的属性菜单中指向net6.0-windows。然后我将代码重新插入类库中,但仍然发生了同样的错误。我同意您的观点,即不应该有必要引用WindowsBase。这在将代码放在wpf项目本身中时是不必要的,但在类库中,我还必须引用PresentationCore和PresentationFramework,它们确实处理了多个错误。