1. Component ์ค๊ณ๋ฅผ ํตํ SVG ์์ด์ฝ ์ฌ์ฉ
์น ๊ฐ๋ฐ์์ SVG ํ์ผ์ ์์ด์ฝ, ๋ก๊ณ ๋ฑ์ ๊ทธ๋ํฝ ์์๋ก ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ ํต์ ์ผ๋ก, ์ด๋ฌํ SVG ํ์ผ๋ค์ ๊ฐ๊ฐ์ ํ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ์๋์ ๊ฐ์ด img ํ๊ทธ๋ฅผ ํตํด ์นํ์ด์ง์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.
<img src="/heart.svg"/>
์ด ๋ฐฉ์์ ํธ๋ฆฌํด ๋ณด์ผ ์ ์์ง๋ง, ํ์ผ์ ์๊ฐ ๋์ด๋๊ณ SVG์ ์คํ์ผ๋ง(์์, ํฌ๊ธฐ ์กฐ์ ๋ฑ)์ด ํ์ํ ๋ ์ฌ๋ฌ ํ๊ณ๋ฅผ ๋๋ฌ๋
๋๋ค. SVG๊ฐ ์ธ๋ถ ํ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์, CSS๋ฅผ ํตํ ์คํ์ผ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ์์ฃ .
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, Blazor ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค . ์ด ๋ฐฉ์์ SVG ์์๋ค์ ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉํ๋ฉฐ, ์ง์ ์ ์ธ ์์ฑ๊ณผ CSS ๋ฑ์ผ๋ก ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋๋ค. ์ด๋ฌ ํ ๋ฐฉ์์ WPF์๋ ๋งค์ฐ ์ ์ฌํด ๋ณด์
๋๋ค.
Blazor Component๋ก SVG ๊ด๋ฆฌ
JamesIcon์ด๋ผ๋ Blazor ์ปดํฌ๋ํธ๋ฅผ ํตํด SVG ์์ด์ฝ์ ๊ด๋ฆฌํฉ๋๋ค. ์ด ์ปดํฌ๋ํธ๋ ๋ค์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด SVG์ ์์ฑ์ ์ฝ๊ฒ ์ ์ํ ์ ์๊ฒ ์ ์ํ ์ ์๊ฒ ๋ฉ๋๋ค.
JamesIcon ์ปดํฌ๋ํธ ์ค๊ณ
@using System.Net.Http
@using Jamesnet.Shared.Local.Helpers
@using Jamesnet.Shared.Local.Models
@inject HttpClient Http
@inject SvgImageRepository SvgImage
<svg class="@Class" @attributes="BuildSvgAttributes()"
xmlns="http://www.w3.org/2000/svg">
<path d="@GetImageData()" fill="@Fill"></path>
</svg>
@code {
[Parameter] public string Class { get; set; }
[Parameter] public string Width { get; set; } = "24";
[Parameter] public string Height { get; set; } = "24";
[Parameter] public string Fill { get; set; } = "#000000";
[Parameter] public string ViewBox { get; set; } = "0 0 24 24";
[Parameter] public string Data { get; set; }
[Parameter] public ImageType ImageType { get; set; }
private Dictionary<string, object> BuildSvgAttributes() => new()
{
{"width", Width},
{"height", Height},
{"viewBox", ViewBox},
{"fill", Fill}
};
private string GetImageData()
{
return !string.IsNullOrEmpty(Data)
? Data : SvgImage.GetImageData(ImageType);
}
}
JamesIcon ์ปดํฌ๋ํธ๋ ์ธ๋ถ์์ ์ ๊ณตํ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด SVG์ ์คํ์ผ์ ์ ์ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ, SVG ํ์ผ์ ์ง์ ์์ ํ์ง ์๊ณ ๋ ์ํ๋ ์คํ์ผ์ ์ ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ฌ์ง์ดWPF์ DependencyProperty ์์ฑ์ฒ๋ผ Binding ๋ฐฉ์๋ ๊ฐ๋ฅํด์ง๋๋ค.
ํ์ฅ์ฑ ์๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ
svg ํ์ผ์ ์ฌ์ฉํ๋ ๋์ , SvgImageRepository ํด๋์ค๋ฅผ ํตํด SVG ๋ฐ์ดํฐ๋ฅผ ImageType
์ด๊ฑฐํ์ ํค๋ก ํ๋ Dictionary
์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํฉ๋๋ค. ์ด ๋ฐฉ์์ ์๋ก์ด SVG ์์ด์ฝ์ ์ถ๊ฐํ ๋ ์์ฝ๊ฒ ํ ์ ์๊ณ , ๊ธฐ๋ฅ์ ์ผ๋ก๋ ์ ์ฐํ ํ์ฅ์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค.
using Jamesnet.Shared.Local.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Jamesnet.Shared.Local.Helpers
{
public class SvgImageRepository
{
private const string ACCOUNT_CIRCLE = "M12,19.2C9....";
private const string ACCOUNT_BOX = "M6,17C6,15 10,...";
private const string EARTH = "M17.9,17.39C17.64...";
private const string HEART_MULTIPLE = "M13.5,20C6.9,...";
private const string HEART = "M12,21...";
private const string HEART_CIRCLE = "M12,2C6.47,...";
private const string STAR = "M12,17.27...";
private const string STAR_CIRCLE = "M16.23,...";
private Dictionary<ImageType, string> svgData = new()
{
{ ImageType.AccountCircle, ACCOUNT_CIRCLE },
{ ImageType.AccountBox, ACCOUNT_BOX },
{ ImageType.Earth, EARTH },
{ ImageType.HeartMultiple, HEART_MULTIPLE},
{ ImageType.Heart, HEART},
{ ImageType.HeartCircle, HEART_CIRCLE},
{ ImageType.Star, STAR},
{ ImageType.StarCircle, STAR_CIRCLE},
};
public string GetImageData(ImageType imageType)
{
if (svgData.TryGetValue(imageType, out string data))
{
return data;
}
return null;
}
}
}
Static ํด๋์ค๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง, ์ด ํด๋์ค๋ ์ธ์คํด์ค ๋ฐฉ์์ผ๋ก ์ค๊ณํ๊ธฐ ๋๋ฌธ์ Blazor์์ ์ด ํด๋์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๋ฑ๋กํ๋ฉด @Injection
๋ฑ๋ก์ ํตํด ์ด๋์๋ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ง๊ธ์ ์ง์ ํด๋์ค์์ SVG ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋๋ก ํ์ง๋ง, .yml ํ์ผ์ ๋๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ผ๋ก ๋ณด์
๋๋ค.
CSS๋ฅผ ํตํ ์คํ์ผ๋ง
JamesIcon ์ปดํฌ๋ํธ์ Class ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ฉํ์ฌ, ์ธ๋ถ CSS์์ SVG์ ์๊ฐ์ ์์ฑ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ width, height, margin ๋ฑ์ ์์ฑ์ svg ํ๊ทธ์, fill ๊ฐ์ ์์ฑ์ path ํ๊ทธ์ ์ ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ณตํต์ ์ธ ์คํ์ผ์ .james-icon ํด๋์ค๋ก ์ ์ํ๊ณ , ์์ด์ฝ๋ณ ๊ฐ๋ณ ์คํ์ผ์ .earth-icon, .heart-icon ๋ฑ๊ณผ ๊ฐ์ด ์ธ๋ถํํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
.james-icon {
width: 40px;
height: 40px;
}
.heart-icon path {
fill: red;
}
.earth-icon path {
fill: blue;
}
์ด๋ ๊ฒ Blazor ์ปดํฌ๋ํธ์ CSS๋ฅผ ํ์ฉํ๋ฉด, SVG ํ์ผ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ์คํ์ผ๋ง์ ์ ์ฐ์ฑ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
Component ์ฌ์ฉํ๊ธฐ
์ด์ SVG ์์ด์ฝ์ ๋์ฑ ์ ์ฐํ๊ฒ ์น ํ์ด์ง์ ํตํฉํ๊ณ , ๋ค์ํ ์คํ์ผ๋ง ์ต์
์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ์ฌ์ฉ์ ํน์ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๊ฐํธํ๊ฒ SVG์ ๋ชจ์, ํฌ๊ธฐ, ์์ ๋ฑ์ ์กฐ์ ํ ์ ์๊ณ , ์์ฝ๊ฒ ์์ฑ๋ค์ ํ์ฅํ ์ ์์ต๋๋ค.
JamesIcon ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
@page "/example"
@inject SvgImageRepository SvgImage
<JamesIcon Class="james-icon heart-icon" ImageType="Heart" Fill="red"/>
<JamesIcon Class="james-icon earth-icon" ImageType="Earth" Fill="blue"/>
์ด์ฒ๋ผ Class๋ฅผ ํตํด ๋์์ธ์ ์ ์ํ๊ฑฐ๋, ImageType์ ํตํด ์์ด์ฝ์ ์ ํํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋๋ค.
SVG ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ
<JamesIcon Class="custom-icon" Data="M12,21.35..." Fill="green"/>
SvgImageRepository๋ฅผ ํตํด ๊ด๋ฆฌ๋๊ณ ์์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ง์ ํ ์๋ ์์ต๋๋ค. ์ด๋ ํ
์คํธ๋ฅผ ํตํด ๋จผ์ ํ์ธ์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ Component๋ฅผ ํตํด SVG ๊ธฐ๋ฐ์ ์์ด์ฝ ์์๋ค์ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค.
์์ด์ฝ ๋ง๊ตฌ ์ฐ๊ธฐโฆ
(์ํ ํ๋ก์ ํธ๋ ์ถํ์ GitHub์ ๋๊ฒ์ ํตํด ๊ณต์ ์์ ์
๋๋ค.)