【问题标题】:Must add reference to WindowsBase.dll to use RenderTargetBitmap.Render method?必须添加对 WindowsBase.dll 的引用才能使用 RenderTargetBitmap.Render 方法吗?
【发布时间】:2022-12-10 10:58:33
【问题描述】:

我目前正在开发一个 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) 的调用上以及将鼠标悬停在 encoder.Save(stream) 上显示的,如图片和上面的代码所示。我相信解决这种依赖关系会解决问题,但我不知道如何解决。谢谢你。 Picture of Project

【问题讨论】:

    标签: wpf livecharts


    【解决方案1】:

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

    【讨论】:

    • 您没有说明您使用的是哪个版本的 .NET,但如果它是 .NET 6 或 .NET 5,则无需从 C# 项目中显式引用 WindowsBase。您需要做的就是更改 CSPROJ 文件的两个属性。将 &lt;TargetFrameWork&gt; 属性从“net6.0”更改为“net6.0-windows”并确保 <UseWpf>true</UseWpf> 属性在那里。这将添加 WindowsDesktop.App.Ref 框架,它将免费为您提供 WindowsBase。
    【解决方案2】:

    我正在使用 .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,它们确实处理了多个问题错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多