svg - 如何在 Blazor wasm .NET 5 中使用内联 svg
问题描述
我的 Blazor wasm 项目面向 .NET 5.0 运行时。我已经安装了 .NET SDK 5.0.200 和 .NET Runtime 5.0.2。
根据 Zaneris 在这个 Github问题上的说法,内联 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 代码视为任何其他标记并将其放入 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。我可以像任何其他组件一样将它放在任何我想要的地方:<SampleSVG />
@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);
}
}
}
专业提示:由于按钮处理程序是异步的,如果你一遍又一遍地快速点击它,你可以改变圆圈的颜色超过 5x/秒。迪斯科!(以及可能的扣押警告......)
推荐阅读
- ios - Swift Realm - 如何计算单列中的所有数据?
- vue.js - 在 Vuex 中,如何在应用程序首先加载/渲染时加载状态并使用状态中的数据?,我使用 nuxt、Vue 和 Vuex 作为存储
- c# - 如何在字典中查找内部哈希集并在 C# 中返回键值?
- java - 在 init() 中使用 JavaFX Alert 时出现 IllegalStateException,因为不在 FX 应用程序线程上
- powershell - 通过powershell“压缩存档”的压缩文件中缺少属性“A”
- python - 在另一个线程中保存大图像
- javascript - 使用 TestScheduler 测试 Epic 时的问题
- vb.net - Random() 似乎一点也不随机
- haskell - 澄清 Haskell 中的存在类型
- java - 我可以限制 x 轴上显示的值的数量吗?