【问题标题】:Is SVG supported in WPF app (Core or Framework.net) and if not, when?WPF 应用程序(Core 或 Framework.net)是否支持 SVG,如果不支持,何时支持?
【发布时间】:2020-02-20 20:20:26
【问题描述】:

昨天我在 WPF 应用程序(.Net Core 3.0 或/和 .Net Framework 4.8)中测试了 SVG 支持,似乎没有一个支持带有 .svg 资源的 Image xaml 标签,而 UWP 项目确实支持它。

有谁知道 WPF 项目何时支持 SVG?

  • 我有 VS 2019 16.3.6(最新)
  • 我不想转换它。我希望(更喜欢)使用与 UWP 中使用的技术相同的技术,其中 SVG 由操作系统直接显示到 Directx 中。
  • 我认为将 .net 框架统一到 Core 会为我们带来 SVG 支持。

.Net 框架 4.8 的示例代码 WPF:

    <Window x:Class="WpfAppTestSvg.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAppTestSvg"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Image Source="Images\w.svg" Width="200" Height="200"></Image>
    </Grid>
</Window>

带有 Core .Net 3.0 的示例代码 WPF

    <Window x:Class="WpfAppWithDotNetCore.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAppWithDotNetCore"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Image Source="Images\w.svg"></Image>
    </Grid>
</Window>

【问题讨论】:

  • 您可以将 SVG 转换为 Path 数据并用于绘图。 this 是一个线程
  • "有谁知道 WPF 项目何时支持 SVG?" 可能永远不会原生。但是有第三方库。
  • @Pavel,谢谢,我不想转换它,如果可能的话,我想使用本机 SVG,以便获得快速渲染的好处,因为 Windows 本身最近引入了 SVG 支持(在 UWP 中使用)。
  • @Clemens,谢谢!虽然它可能是一个不错的选择,但外部库可能比 UWP SvgImageSource 慢很多,这得益于最近更新的 Windows 10 操作系统中的新 SVG 支持。
  • 我推荐一个 Nuget WPF 库“SVG2XML”。但是,它只支持.net framework,不支持.net core。

标签: c# wpf svg .net-core uwp


【解决方案1】:

访问https://github.com/BerndK/SvgToXaml

您可以像这样使用 SvtToXaml 获取 DrawingImage:

<DrawingImage x:Key="____3_01DrawingImage">
            <DrawingImage.Drawing>
                <DrawingGroup ClipGeometry="M0,0 V89 H230 V0 H0 Z">
                    <GeometryDrawing Brush="#FFD1D1D1" Geometry="F1 M230,89z M0,0z M222.5,80L222.5,80 14.1,80 14.1,77.6 15.1,77.6 15.1,79 221.5,79 221.5,11.6 215.8,11.6 215.8,10.6 222.5,10.6z" />
                    <DrawingGroup>
                        <GeometryDrawing Brush="#FF4AC0E0">
                            <GeometryDrawing.Geometry>
                                <RectangleGeometry RadiusX="0" RadiusY="0" Rect="9.7,7.7,209.3,69.9" />
                            </GeometryDrawing.Geometry>
                        </GeometryDrawing>
                    </DrawingGroup>
                </DrawingGroup>
            </DrawingImage.Drawing>
        </DrawingImage>

【讨论】:

  • 我说我不想转换它。我希望原生支持 svg。
【解决方案2】:

我已通过 Github 中的源代码将 .net 框架版本 Svg2Xaml 迁移到 .net 核心。

https://github.com/kyuranger/Svg2XamlCore/tree/master/Svg2Xaml

我已向其作者发送了一封电子邮件,建议将其迁移到.net core,但没有收到回复。

我不知道这是否是解决版权问题的正确方法,但它似乎是解决它的最快方法。

【讨论】:

  • 谢谢。转换的方法很少,但我认为微软现在直接在 DirectX 中支持 SVG,这应该非常快(使用显卡加速等)。我还认为微软在 UWP 中添加了对 SVG 的支持,因为它针对的是 MS 平台并且可以依赖其新的 API (DirectX)。但我想知道它是否会移植到 .Net Core 上,如果是,什么时候移植? ... 移植到 .Net Core 将意味着为 Microsoft 以外的平台创建替代方案。 MS 说一切都将合并到 .Net Core... 那么什么时候 SVG 呢?
  • 谢谢!我试试看。它似乎运作良好。我在其中发现了 2 个错误: 1 - 当图像中存在错误(无限递归)时,它会因堆栈溢出而崩溃。 2 - 如果有 2 个变换,它会永远循环。我都修好了。你想知道我是否可以将我的修复与你的代码合并?我的电子邮件是“ireq.ca”上的“ouellet.eric”。
  • @EricOuellet 是的,请合并它。我只是通过更改项目的某些属性将其迁移到 .net 核心,但从不更改代码。之后,我主要编写 asp.net core 代码,现在几乎从不使用它。请更新一下,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多