【问题标题】:How to use inline svg's in Blazor wasm .NET 5如何在 Blazor wasm .NET 5 中使用内联 svg
【发布时间】:2021-03-04 23:23:24
【问题描述】:

我的 Blazor wasm 项目面向 .NET 5.0 运行时。我已经安装了 .NET SDK 5.0.200 和 .NET Runtime 5.0.2。

根据这个 Github 上的 Zaneris issue,内联 svg 可以像这样在 Blazor 中使用:

<div>
   <svg> <use xlink:href="images/test.svg#test-logo" /> </svg>
</div>

但是,我只能让它像这样工作:

         <div>
            <svg>
                <symbol id="test-logo" viewBox="0 0 255.905 185.056">
                    <g id="Group_284" data-name="Group 284" transform="translate(-65.569 -74.438)">
                        ...
                    </g>
                </symbol>
                <use xlink:href="#test-logo" />
            </svg>
        </div>

我做错了什么?我需要在 head 标签中链接 svg 文件吗?如果是这样,我将“rel”设置为什么?

我希望能够直接从 wwwroot 中的 svg 文件引用符号 ID。

【问题讨论】:

    标签: svg blazor


    【解决方案1】:

    我想向您推荐将 .svg 代码视为任何其他标记并将其放入 Razor 组件的想法。这样,您可以将它内嵌在任何您想要的位置,并像使用任何其他剃须刀控件一样控制变量:

    这是从 illustrator 保存的 .svg:(sample.svg)

    <!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
        <text transform="matrix(1 0 0 1 16.2917 24.9155)"><tspan x="0" y="0" font-family="'MyriadPro-Bold'" font-size="12px">Lorem ipsum</tspan></text>
        <circle fill="#EC008C" stroke="#000000" stroke-miterlimit="10" cx="50" cy="58.8" r="15.3" />
    </svg>
    

    这是我用它制作的剃须刀页面,(SampleSVG.razor)。注意变量 @Text@fill。我可以像任何其他组件一样将它放在任何我想要的位置:&lt;SampleSVG /&gt;

    @page "/svgsample"
    
    
    Change Text: <input @bind="@Text" /><button @onclick="DoCoolStuff">Go Crazy!</button>
    <div style="width:50%; height:auto">
        <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
                viewBox="0 0 100 100" enable-background="new 0 0 100 100" style="stroke-width: 0px; background-color: #000000;" xml:space="preserve">
            <text transform="matrix(1 0 0 1 16.2917 24.9155)">
                <tspan x="0" y="0" fill="orange" font-family="'MyriadPro-Bold'" font-size="12px">@Text</tspan>
            </text>
            <circle fill="@fill" stroke="#000000" stroke-miterlimit="10" cx="50" cy="58.8" r="15.3" />
        </svg>
    </div>
    
    
    @code {
        string Text = "Start Text";
        string fill = "#EC008C";
        Random random = new Random();
    
        async Task DoCoolStuff()
        {
            for (int i=0; i< 5; i++)
            {
                fill = String.Format("#{0:X6}", random.Next(0x1000000));
                StateHasChanged();
                await Task.Delay(200);
            }
        }
    }
    

    专业提示:由于按钮处理程序是异步的,如果您一遍又一遍地快速单击它,您可以将圆圈的颜色更改为 5 倍/秒以上。迪斯科! (以及可能的扣押警告......)

    【讨论】:

    • 顺便说一句,让您知道它不仅适用于一个浏览器:caniuse.com/svg-html5
    • 这可行。您将如何处理多个符号在 1 个文件中并且您只需要选择 1 个进行渲染的情况?你会在 razor 组件上创建一个类似 enum 属性的东西并有条件地显示符号,或者你会如何实现它?
    • 这是有大约一百种剥猫皮方法的案例之一。这取决于您有多少符号,以及将它们保存在原始文件中对您是否重要,以及您是否真的关心我刚刚展示的任何恶作剧(您可能不关心)。
    • 我明白了。我最初通过符号 ID 要求内联 svg 的原因是因为我们有包含大量符号的大型 svg 文件。它们本质上用作图标。我真的不想要每个文件一个,需要在任何组件中根据需要拉取它们。 JavaScript SPA 可以做到这一点,如果我有机会出售 Blazor,我需要与 Blazor 竞争。
    【解决方案2】:

    好的,我制作了一个示例文件并测试了您在 OP 中提到的技术,并且能够通过#reference 显示单个文件中的两个符号。所以技术似乎不是问题。

    但是,它们与原版完全相反。我的理解是你可以只使用一个符号,它会工作,但也许它需要更多的修补,关于正确设置视图框?

    --编辑--
    根据Mozilla,“xlink:href”现在已经过时了。因此,在未来的某个时候,客户站点可能会崩溃。我怀疑它会很快,因为它似乎是一个非常新的更新,但需要考虑。

    【讨论】:

    • 哦,有趣。我将该 svg 文件从 Vue.js 项目中取出,并将其放入 Blazor 以以相同的方式引用它。所以你认为它在 Blazor 中的渲染可能会有所不同?我什么都没有。我会尝试一些其他符号,看看我能不能得到任何东西。您是否必须在 head 标签中链接文件?
    • 发现问题。在 Vue.js 中,使用的 svg 文件中没有 svg 标签。它只有符号标签。在 Blazor 中,我必须将符号标签包装在 svg 标签中,并且它起作用了!我能够像在我的 OP 中一样使用它。不需要头部链接。感谢您引导我朝着正确的方向前进。
    • 我不能投票,因为我没有 15 声望。
    • 哈哈没问题。尽管我的做事方式已经相当不错了,但老实说,我不知道符号或在这样的文件中引用符号。现在我肯定需要制作一个大图标文件。不过,请阅读我对我上一个答案的更新评论,因为在不久的将来这种方法可能会出现一个小问题。
    猜你喜欢
    • 2020-11-22
    • 2021-11-09
    • 2021-08-12
    • 2021-11-23
    • 2021-10-31
    • 2021-05-30
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多