์๋
ํ์ธ์, ์ฒ์ ์ธ์ฌ๋๋ฆฝ๋๋ค.
๋ท๋ท๋ฐ๋ธ๋ ์ค๋ ์ ๋ถํฐ ์๊ณ ์์๋๋ฐ ์ด๋ฒ์ ์ฒ์์ผ๋ก ๊ธ์ ์ฌ๋ ค๋ณด๊ฒ ๋์์ด์!
์ ๋ ์ค๊ตญ์ธ์ด๊ณ ํ๊ตญ์์ ์ด๊ณ ์๋ ๊ฐ๋ฐ์ Vicky๋ผ๊ณ ํฉ๋๋ค. ์ ๋ ํ์ฌ WPF ์ผ์ ํ๊ณ ์๊ณ , Jamesnet์ด๋ผ๋ ์ ํ๋ธ๋ฅผ ํตํด ์์ ํฌ๋ฆฌ์์ดํฐ ํ๋๋ ํ๊ณ ์์ต๋๋ค. (์ค๊ตญ์ ์ ํ๋ธ์ธ BiliBili ํ๋ซํผ์์๋ ํ๊ณ ์์ด์)
์ด ๊ธ์ LOL PlayButton ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ ๋ด์ฉ์ ๋ด๊ณ ์์ต๋๋ค. ์ง๋๋ฒ ThemeSwitch ๊ตฌํ ์์์ ์ด์ด ๋ ๋ฒ์งธ ์งง์ ํํ ๋ฆฌ์ผ ์์์ด๊ธฐ๋ ํฉ๋๋ค. Youtube๋ฅผ ํตํด ์์๊ณผ ํ๊ธ ์๋ง์ผ๋ก๋ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ CodeProject๋ฅผ ํตํด์๋ Article์ ์ดํด๋ณด์ค ์ ์์ต๋๋ค.
์๋๋ CodeProject๋ฅผ ํตํด ์ด์ ๊ธฐ๊ณ ํ๋ ๊ธ์ ํ๊ธ๋ก ๋ฒ์ญํ ๋ด์ฉ์
๋๋ค.
(GPT์ ๋์์ ์์ฃผ ๋ง์ด ๋น๋ ค ํ๊ตญ์ด ๊ธ์ ์์ฑํ์ผ๋ ๋ถ์์ฐ์ค๋ฌ์ด ๋ถ๋ถ์ ์ดํดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค )
Abstract
์ด ๊ธ์ ์์ WPF ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ โ๋ฆฌ๊ทธ ์ค๋ธ ๋ ์ ๋โ ๊ฒ์์์ ์๊ฐ์ ๋ฐ์ PLAY ๋ฒํผ์ ๊ฐ๋ฐํ๋ ๊ณผ์ ์ ์์ธํ ์ค๋ช
ํ๊ณ ๋ถ์ํ ๊ธ์
๋๋ค. WPF์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ค์ํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ๊ฐ์กฐํ๋ฉฐ, ์คํ ์์ค ๊ฐ๋ฐ์ ๋ํ ์๋ก์ด ๊ด์ ์ ์ ์ํฉ๋๋ค. ๋ํ ์ ๋๋ฉ์ด์
๊ณผ ํธ๋ฆฌ๊ฑฐ์ ๊ฐ์ ๊ณ ๊ธ WPF ๊ธฐ๋ฅ์ ํ๊ตฌํ์ฌ ์ฌ์ฉ์ ์ํธ์์ฉ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
์๊ฐ
์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ฑ ์์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ์ค์ํฉ๋๋ค. ๊ฒ์์์ ๋ฐ์์ด ๋น ๋ฅด๊ณ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ PLAY ๋ฒํผ์ ์ํฐํ ์ธ๋จผํธ ์ธ๊ณ๋ก์ ๊ด๋ฌธ์ ๋๋ค. ์ด ๊ธ์ ๋ฆฌ์น ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์ธ WPF๋ฅผ ์ฌ์ฉํ์ฌ PLAY ๋ฒํผ์ ๋ง๋๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค.
ํ๋ก์ ํธ ๋ฐฐ๊ฒฝ
์ด ๊ธ์์ ๋ ผ์๋ ํ๋ก์ ํธ๋ WPF ๊ธฐ์ ์ ๋ฅ๋ ฅ์ ๊ฐ๋ฅํ ํ ํฌ๊ด์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ ธ๋ ฅํฉ๋๋ค. ๋ช ๋ ์ ์ ์ด ํ๋ก์ ํธ๋ฅผ ์ถ์ํ ํ ๊ธ์ ์ ์ธ ๋ฐ์์ ๋ฐ์์ผ๋ฉฐ, ์ด๋ ์คํ ์์ค ๊ฐ๋ฐ์ ๊ณ์ ๊ธฐ์ฌํ๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํ์ต๋๋ค. .NET ๊ธฐ์ ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ, GitHub์ ๊ณต์ ๋ ์ฝ๋๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ์ ์ ํ๊ณ ์์ต๋๋ค. ์ด ์ ์ฒด ํ๋ก์ ํธ์ ํฌํจ๋ ๋ฐฉ๋ํ ๋ด์ฉ์ ๊ณ ๋ คํ์ฌ, ๊ฐ ๋ถ๋ถ์ ๊ตฌ์ฑ๊ณผ ๊ธฐ์ ์ ์ด์ ์ ์์ธํ ๋ถ์ํ์ฌ ์ ๊ณตํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ด๋ ๋ ๋ง์ WPF ๊ธฐ์ ์ ์ข์ํ์ ๋ถ๋ค์ด ํ์ต ์ฌ์ ์์ ๋์์ ๋ฐ์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๋ง์์์์ ๋๋ค.
๋ฒํผ ๊ตฌ์ฑ
๋ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณผ ๋, ์ด PLAY ๋ฒํผ์ WPF ToggleButton์์ ์์ฑ์ ์์๋ฐ์ต๋๋ค. ์ผ์ชฝ์๋ โ๋ฆฌ๊ทธ ์ค๋ธ ๋ ์ ๋โ ๊ฒ์์ ๋ก๊ณ ๊ฐ ์๊ณ , ์ค๋ฅธ์ชฝ์๋ ๊ฒฝ๊ณ์ , ์ด๋ฏธ์ง, ํ ์คํธ ๋ฑ ๋ค์ํ ๋์์ธ์ ์์๋ค์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋ํ, ๋ง์ฐ์ค์ค๋ฒ ๋ฐ ์ฒดํฌ ํธ๋ฆฌ๊ฑฐ ํจ๊ณผ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
์ฃผ์ ๋ด์ฉ ๋ถ์
1.๋น์ ํ ํํ ๋ง๋ค๊ธฐ
์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ๊ทธ๋ํฝ์ Border ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ธ์ฝ๋ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง, ๋์ด ๋พฐ์กฑํ๊ณ ํธ๊ฐ ์๋ ์ธ ๋ฒ์งธ ๊ทธ๋ํฝ์ ๋จ์ํ Border๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฒ์์๋ ๋ค๊ฐํ๊ณผ ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฆด ์ ์์ง๋ง, ๋ค๊ฐํ ์์ฑ์ ํธ๋ฅผ ๊ทธ๋ฆฌ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๊ทธ๋์ Path ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉํด์ผ ํฉ๋๋ค.
์์ธ ๋ถ์
<Style TargetType="{x:Type Path}" x:Key="Arrow">
<Setter Property="Fill" Value="#1E2328"/>
<Setter Property="Stroke" Value="{StaticResource ArrowStroke}"/>
<Setter Property="StrokeThickness" Value="2"/>
<Setter Property="Data" Value="M 0,0 L 103,0 L 118,14 L 103,28 L 0,28 C 10,14 0,0 0,0 Z"/>
<Setter Property="Margin" Value="40 5 4 -5"/>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect BlurRadius="5" ShadowDepth="2"/>
</Setter.Value>
</Setter>
</Style>
WPF์์ Path ์ปจํธ๋กค์ ๋ค์ํ ํํ์ ์ค๊ณฝ์ ๊ทธ๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. Path ์ปจํธ๋กค์ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํํ๋ฅผ ์ ์ํ๋ฉฐ, ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ ํํ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ ์ผ๋ จ์ ๋ช ๋ น๊ณผ ์ขํ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
Path ์ปจํธ๋กค์ ๊ธฐ๋ณธ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Data ์์ฑ: Data ์์ฑ์ Path ์ปจํธ๋กค์ ์ค์ํ ์์ฑ์ผ๋ก, ํํ์ ์ค๊ณฝ์ ์ค๋ช ํ๋ ๋ช ๋ น๊ณผ ์ขํ๋ก ๊ตฌ์ฑ๋ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฒฝ๋ก ๋ฐ์ดํฐ์ ํ์์๋ MoveTo (M), LineTo (L), CurveTo (C), ClosePath (Z) ๋ฑ ๋ค์ํ ๋ช ๋ น์ด ์ขํ์ ๊ฒฐํฉ๋์ด ํํ๋ฅผ ์ ์ํฉ๋๋ค.
- Fill ์์ฑ: Fill ์์ฑ์ ํํ ๋ด๋ถ๋ฅผ ์ฑ์ฐ๋ ์์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์, ๊ทธ๋ผ๋ฐ์ด์ , ํจํด ๋๋ ํฌ๋ช ๋๋ฅผ ์ฌ์ฉํ์ฌ ํํ์ ๋ด๋ถ๋ฅผ ์ฑ์ธ ์ ์์ต๋๋ค.
- Stroke ์์ฑ: Stroke ์์ฑ์ ํํ์ ์ค๊ณฝ์ ์์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์ํ ์์์ ์ฌ์ฉํ์ฌ ์ค๊ณฝ์ ์ ์์์ ์ ์ํ ์ ์์ต๋๋ค.
- StrokeThickness ์์ฑ: StrokeThickness ์์ฑ์ ์ค๊ณฝ์ ์ ๋๊ป๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ค๊ณฝ์ ์ ๋๋น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ช ๋ น๊ณผ ์ขํ:๊ฒฝ๋ก ๋ฐ์ดํฐ๋ ๋ช ๋ น๊ณผ ์ขํ์ ์ฐ์์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด๋ฌํ ๋ช ๋ น์ WPF์๊ฒ ํ ์ง์ ์์ ๋ค๋ฅธ ์ง์ ๊น์ง ๋ชจ์์ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ๋ก ๋ช ๋ น์๋ ๋ค์์ด ์์ต๋๋ค:
M (MoveTo): ์ง์ ๋ ์ขํ๋ก ๊ทธ๋ฆฌ๊ธฐ ์ง์ ์ ์ด๋ํฉ๋๋ค.
L (LineTo): ์ง์ ๋ ์ขํ๋ก ์ง์ ์ ๊ทธ๋ฆฝ๋๋ค.
C (CurveTo): ์ ์ด ์ ์ ์ฌ์ฉํ์ฌ ๋ฒ ์ง์ด ๊ณก์ ์ ๊ทธ๋ฆฝ๋๋ค.
Z (ClosePath): ๊ฒฝ๋ก๋ฅผ ๋ซ์ ํ์ฌ ์ง์ ์ ์์ ์ง์ ์ ์ฐ๊ฒฐํ์ฌ ๋ซํ ๋ชจ์์ ํ์ฑํฉ๋๋ค.
Data ์์ฑ์ ๊ฒฝ๋ก ์ปจํธ๋กค์ ์ค์ํ ์์ฑ์ผ๋ก, ๋ชจ์์ ์ค๊ณฝ์ ์ ์ํ๋ ๋ช ๋ น๊ณผ ์ขํ๋ฅผ ํฌํจํ๋ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ ๊ฒฝ๋ก์ ์ค๊ณฝ์ ์ค๋ช ํ๊ธฐ ์ํด ๋ช ๋ น์ ์ฐ์์ ์ฌ์ฉํฉ๋๋ค. ์ด ํ๋ก์ ํธ์ ๊ฒฝ๋ก ๋ฐ์ดํฐ์ ๋ํ ๋ช ๋ น๊ณผ ์ขํ์ ์์ธํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๊ฐ๋จํ๊ฒ X/Y ์ขํ ์ถ์ผ๋ก ํด์ํ ์ ์์ต๋๋ค. ์ด ๋ชจ์์ ๊ธธ์ด๋ฅผ 118๋ก ์ค์ ํ๊ณ ๋๋น๋ฅผ 28๋ก ์ค์ ํฉ๋๋ค:
M 0,0: ์ด๊ฒ์ โMoveToโ ๋ช ๋ น์ผ๋ก, ๊ทธ๋ฆฌ๊ธฐ ์ง์ ์ ์ขํ (0, 0)๋ก ์ด๋ํ์ฌ ์์ ์ง์ ์ ๋ํ๋ ๋๋ค.
L 103,0: ์ด๊ฒ์ โLineToโ ๋ช ๋ น์ผ๋ก, ํ์ฌ ์ง์ (0, 0)์์ ์ขํ (103, 0)๋ก ์ง์ ์ ๊ทธ๋ฆฝ๋๋ค. ์ด์ด์ (118, 14), (103, 28), (0, 28)๋ก ์ ์ ๊ทธ๋ฆฝ๋๋ค.
์ด๊ฒ์ ๋์นญ ๋ชจ์์ด๋ฏ๋ก ๋ ๋ฒ์งธ ์ ์ Y ์ขํ๋ ๋ชจ์์ ์ด ๋์ด์ ์ ๋ฐ์ธ 14์ ๋๋ค.
๋ค์์ ๊ณก์ ์ ๊ทธ๋ฆฌ๋ ๋ถ๋ถ์ ๋๋ค: C 10,14 0,0 0,0 z: ์ด๊ฒ์ โ๋ฒ ์ง์ด ๊ณก์ โ ๋ช ๋ น์ผ๋ก, ์์ ์ ์ด ์ ์ด ์ ์ด๊ณ ๋ค์ ์ ์ด ๋ ์ ์ธ ๋ฒ ์ง์ด ๊ณก์ ์ ์ ์ํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ์ด ์ ์ด (10, 14)์ด๊ณ ๋ ์ ์ด (0, 0)์ธ ๋ฒ ์ง์ด ๊ณก์ ์ ์ ์ํ๋ฉฐ, โzโ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ๋ซ์ ์์ ์ง์ (0, 0)์ ์ฐ๊ฒฐํฉ๋๋ค.
2.๊ทธ๋ผ๋ฐ์ด์ ์์ ๋ง๋ค๊ธฐ
LinearGradientBrush์ ์ฃผ์ ์์ฑ ๋ฐ ์ฌ์ฉ๋ฒ
- StartPoint๋ฐ EndPoint:
StartPoint๋ ๊ทธ๋ผ๋ฐ์ด์ ์ ์์์ ์ ์ง์ ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์๋ ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ํ์๋ฉ๋๋ค. ์ฌ๊ธฐ์ (0, 0)์ ์ข์๋จ์ด๊ณ (1, 1)์ ์ฐํ๋จ์ ๋ํ๋ ๋๋ค. EndPoint๋ ์๋ ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ผ๋ฐ์ด์ ์ ๋์ ์ ์ง์ ํฉ๋๋ค. - GradientStops:
GradientStops์ GradientStop ๊ฐ์ฒด์ ์ปฌ๋ ์ ์ผ๋ก, ๊ฐ ๊ฐ์ฒด๋ ์์๊ณผ ์๋ ์์น(Offset)๋ฅผ ์ ์ํฉ๋๋ค. GradientStop์ Color ์์ฑ์ ์ง์ ๋ ์์น์ ์์์ ์ ์ํ๊ณ , Offset ์์ฑ์ ๊ทธ๋ผ๋ฐ์ด์ ๋ด์์ ์์์ ์์น๋ฅผ ์ ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 0์์ 1 ์ฌ์ด์ ๋ฒ์์ ๋๋ค. - ๊ทธ๋ผ๋ฐ์ด์
๋ฐฉํฅ:
๊ทธ๋ผ๋ฐ์ด์ ์ ๋ฐฉํฅ์ StartPoint ๋ฐ EndPoint์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด StartPoint๊ฐ (0, 0)์ด๊ณ EndPoint๊ฐ (1, 1)์ธ ๊ฒฝ์ฐ ๊ทธ๋ผ๋ฐ์ด์ ์ ์ข์๋จ์์ ์ฐํ๋จ์ผ๋ก ์ ํ๋ฉ๋๋ค. - ๊ทธ๋ผ๋ฐ์ด์
์ ํ:
LinearGradientBrush๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ ๊ทธ๋ผ๋ฐ์ด์ ์ผ๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ ์์์ด ์ง์ ์ ๋ฐ๋ผ ์ ํ๋ฉ๋๋ค. StartPoint์ EndPoint๋ฅผ ์กฐ์ ํ์ฌ ๊ทธ๋ผ๋ฐ์ด์ ์ ๋ฐฉํฅ๊ณผ ์์์ ์ ๋ณ๊ฒฝํ์ฌ ๋ค์ํ ๊ทธ๋ผ๋ฐ์ด์ ํจ๊ณผ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ด ํ๋ก์ ํธ์์๋ ๋ชจ์์ ์ค์์์ ์์ํ์ฌ ์๋๋ก ์ด๋ํ๋ ์์ง ๊ทธ๋ผ๋ฐ์ด์ ์ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ StartPoint๋ฅผ (0.5, 0)์ผ๋ก ์ค์ ํ์ฌ ๊ทธ๋ผ๋ฐ์ด์ ์ ์์์ ์ ์๋จ ์ค์์ผ๋ก ์ง์ ํ๊ณ EndPoint๋ (0.5, 1)๋ก ์ค์ ํ์ฌ ๊ทธ๋ผ๋ฐ์ด์ ์ ๋์ ์ ํ๋จ ์ค์์ผ๋ก ์ง์ ํฉ๋๋ค.
๊ทธ ๋ค์, GradientStops ์ปฌ๋ ์ ์๋ ์๋ก ๋ค๋ฅธ ์์๊ณผ ์๋์ ์ธ ์์น๋ฅผ ์ ์ํ๋ ์ธ ๊ฐ์ GradientStop ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค:
-
์ฒซ ๋ฒ์งธ GradientStop:
Color๋ #CC3FE7EE๋ก ์ค์ ๋์ด ์์ ๊ฐ์ ๋ํ๋ ๋๋ค.
Offset์ 0์ผ๋ก ์ค์ ๋์ด ์ด ์์์ด ๊ทธ๋ผ๋ฐ์ด์ ์ ์์์ ์ ์์นํจ์ ๋ํ๋ ๋๋ค. -
๋ ๋ฒ์งธ GradientStop:
Color๋ #CC006D7D๋ก ์ค์ ๋ฉ๋๋ค.
Offset์ 0.5๋ก ์ค์ ๋์ด ์ด ์์์ด ๊ทธ๋ผ๋ฐ์ด์ ์ ์ค๊ฐ์ ์ ์์นํจ์ ๋ํ๋ ๋๋ค. -
์ธ ๋ฒ์งธ GradientStop:
Color๋ #CC0493A7๋ก ์ค์ ๋ฉ๋๋ค.
Offset์ 1๋ก ์ค์ ๋์ด ์ด ์์์ด ๊ทธ๋ผ๋ฐ์ด์ ์ ๋์ ์ ์์นํจ์ ๋ํ๋ ๋๋ค.
3. Path ๋ฐ Border Thickness ์ฒ๋ฆฌ์ ๋ํด์
Border ์ปจํธ๋กค์์:
Border ์ปจํธ๋กค์ ํ ๋๋ฆฌ ์ ์ Border ๋ด์ ํฌํจ๋ฉ๋๋ค. ํ ๋๋ฆฌ ์ ์ ๋๊ป๋ BorderThickness ์์ฑ์ ์ํด ์ ์ด๋๋ฉฐ, ํ ๋๋ฆฌ ์ ์ ๋๋น๋ฅผ ๋๋ฐ์ด์ค ๋ ๋ฆฝ์ ์ธ ํฝ์ (DIPs)๋ก ์ง์ ํฉ๋๋ค.
Path ์ปจํธ๋กค์์:
Path ์ปจํธ๋กค์ ํ ๋๋ฆฌ ์ ์ StrokeThickness ์์ฑ์ ์ค์ฌ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ ค์ง๋๋ค. StrokeThickness๋ ํ ๋๋ฆฌ ์ ์ ๋๊ป๋ฅผ ์ ์ดํ๋ฉฐ, ์ค์ฌ์ผ๋ก๋ถํฐ ํ ๋๋ฆฌ ์ ์ด ์ผ๋ง๋ ๋ป์ด๋๊ฐ์ง๋ฅผ ๋ํ๋ ๋๋ค.
์ด ๊ณ ์ ํฌ๊ธฐ์ ๊ทธ๋ํฝ์์ Border์ Path์ ๋๊ป๋ฅผ ๋ชจ๋ 2๋ก ์ค์ ํ๊ณ Margin์ 4 4 4 4๋ก ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ค์ ์์ Path์ ์๋จ ํ ๋๋ฆฌ๊ฐ Border๋ฅผ ๋ฒ์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ StrokeThickness๋ฅผ ๊ณ ๋ คํ์ฌ Path์ Margin์ ์กฐ์ ํด์ผ ํฉ๋๋ค. ์ผ์ชฝ Margin์ ์ด๋ฏธ 40์ผ๋ก ์ค์ ๋์ด GreenLine์ ๋ฎ์ ์ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋จ Margin์ 1ํฝ์ ์ฆ๊ฐํ์ฌ 5ํฝ์ ๋ก ์ค์ ํด์ผ ํ๋ฉฐ, ์ค๋ฅธ์ชฝ ๋ฐ ํ๋จ Margin์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. Path์ ํฌ๊ธฐ๊ฐ 118x28๋ก ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก Margin์ ์กฐ์ ํด์ผ ํ๋ ๊ฒ์ ์ผ์ชฝ ๋ฐ ์๋จ Margin ๋ฟ์ ๋๋ค.
๋ํ ์๋จ Margin์ด 5ํฝ์ ์ฆ๊ฐํ๋ฉด ํ๋จ์ด ์๋ฆฐ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ํ๋จ Margin์ -5ํฝ์ ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋จ์ ์ถ๊ฐ๋ 5ํฝ์ ์ด ์ ๊ฑฐ๋์ด ๋ ์ด์์์ด ๊ท ํ์ ์ด๋ฃน๋๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํ๋จ Margin์ 0ํฝ์ ๋ก ์ ์งํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์๋จ Margin์ ์ถ๊ฐํจ์ผ๋ก์จ ํ๋จ์ด ์๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
4. Jamesnet.WPF Nuget๋ฅผ ์ฌ์ฉํ ์ ๋๋ฉ์ด์ ์์ฑ
WPF์์๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋์ฑ ํฅ๋ฏธ๋กญ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ค์ํ ๋์ ์ ๋๋ฉ์ด์ ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด ํ๋ก์ ํธ์์๋ TextBlock์ ํ ์คํธ ๋ถ๋ถ์ ํฅ๋ฏธ๋ก์ด ์ ๋๋ฉ์ด์ ์ ์ถ๊ฐํ๊ธฐ ์ํด ๋๊ป ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
<Application x:Class="VickyPlayButton.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:james="https://jamesnet.dev/xaml/presentation"
StartupUri="MainWindow.xaml">
<Application.Resources>
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="Height" Value="38"/>
<Setter Property="Width" Value="165"/>
<Setter Property="Foreground" Value="#FFFFFF"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<ControlTemplate.Resources>
<Storyboard x:Key="Checked">
<james:ThickItem Mode="CubicEaseInOut" TargetName="play" Property="Margin" Duration="0:0:0:0.5" To="30 100 0 0"/>
<james:ThickItem Mode="CubicEaseInOut" TargetName="stop" Property="Margin" Duration="0:0:0:0.5" To="30 0 0 0"/>
</Storyboard>
<Storyboard x:Key="UnChecked">
<james:ThickItem Mode="CubicEaseInOut" TargetName="play" Property="Margin" Duration="0:0:0:0.5" To="30 0 0 0"/>
<james:ThickItem Mode="CubicEaseInOut" TargetName="stop" Property="Margin" Duration="0:0:0:0.5" To="30 0 0 100"/>
</Storyboard>
</ControlTemplate.Resources>
<Grid Background="{TemplateBinding Background}">
<Border Style="{StaticResource GoldLine}"/>
<Image Style="{StaticResource Emblem}"/>
<Border Style="{StaticResource GreenLine}"/>
<Path x:Name="path" Style="{StaticResource Arrow}"/>
<Grid>
<Grid.Clip>
<RectangleGeometry Rect="0,5,165,28"/>
</Grid.Clip>
<TextBlock x:Name="play" Style="{StaticResource Play}"/>
<TextBlock x:Name="stop" Style="{StaticResource Stop}"/>
</Grid>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="path" Property="Fill" Value="{StaticResource ArrowFillOver}"/>
<Setter TargetName="path" Property="Stroke" Value="{StaticResource ArrowStrokeOver}"/>
<Setter Property="Foreground" Value="#FFFCF1DC"/>
<Setter Property="Cursor" Value="Hand"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="path" Property="Fill" Value="#1E2328"/>
<Setter TargetName="path" Property="Stroke" Value="#5C5B57"/>
<Setter Property="Foreground" Value="#3C3C41"/>
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Checked}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource UnChecked}"/>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
</Application>
์ ๋๋ฉ์ด์ ์ ControlTemplate.Resources๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ ์ ์์ผ๋ฉฐ โCheckedโ ๋ฐ โUnCheckedโ ๋ ์ ๋๋ฉ์ด์ ๋ฆฌ์์ค๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. โCheckedโ ์ํ์์๋ โPlayโ ํ ์คํธ๊ฐ ์ ๊ฑฐ๋๊ณ โStopโ ํ ์คํธ๊ฐ ๋ค์ด์ค๋ฉฐ, โUnCheckedโ ์ํ์์๋ โStopโ ํ ์คํธ๊ฐ ์ ๊ฑฐ๋๊ณ โPlayโ ํ ์คํธ๊ฐ ๋ค์ด์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ง๋ ํจ๊ณผ๋ฅผ ์ฐ์์ํค๋ ์ ๋๋ฉ์ด์ ์ด ๋ง๋ค์ด์ง๋๋ค.
์ ๋๋ฉ์ด์ ์ ์์ฑํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๋๋ก WPF์ ๋ค์ํ ์ ๋๋ฉ์ด์ ์ Jamesnet.WPF Nuget ํจํค์ง๋ก ์ปดํ์ผํ๊ณ ์ ๋ฆฌํ์ต๋๋ค. ์ด ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ์ ๋๋ฉ์ด์ ์ ์ฝ๊ฒ ์ฌ์ฉํ๊ณ ์์ฑํ ์ ์์ต๋๋ค.
5.Grid.Clip ์์ฑ ์ฌ์ฉ
Grid ๋ด์ ์์๋ค์ด ์๋ก ๊ฒน์น๊ธฐ ๋๋ฌธ์ ํ ์คํธ๊ฐ ์์๋๋ก ์คํฌ๋กค๋๋ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ๋ ํ ์คํธ๊ฐ ํ ๋๋ฆฌ๋ฅผ ๋ฒ์ด๋๋ ์๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด <Grid.Clip> ์์ฑ์ ์ฌ์ฉํฉ๋๋ค.
<Grid Background="{TemplateBinding Background}">
<Border Style="{StaticResource GoldLine}"/>
<Image Style="{StaticResource Emblem}"/>
<Border Style="{StaticResource GreenLine}"/>
<Path x:Name="path" Style="{StaticResource Arrow}"/>
<Grid>
<Grid.Clip>
<RectangleGeometry Rect="0,5,165,28"/>
</Grid.Clip>
<TextBlock x:Name="play" Style="{StaticResource Play}"/>
<TextBlock x:Name="stop" Style="{StaticResource Stop}"/>
</Grid>
</Grid>
<Grid.Clip>์ ์์ ์์์ ๊ฐ์ ์์ญ์ ์ ํํ๋ ํด๋ฆฌํ ์์ญ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ XAML ์์์ ๋๋ค. ํด๋ฆฌํ ์์ญ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ฐํ๊ณผ ๊ฐ์ ๋ชจ์์ด๋ฉฐ, ํด๋ฆฌํ ์์ญ ๋ด์ ๋ด์ฉ๋ง ํ์๋๊ณ ๊ทธ ๋ฐ์ ๋ด์ฉ์ ์จ๊ฒจ์ง๋๋ค.
์ด ํ๋ก์ ํธ์์๋ <Grid.Clip> ์์ญ์ด Path์ ํฌ๊ธฐ ๋ด์์ ์ค์ ๋ฉ๋๋ค: Rect=โ0,5,165,28โ. ์ด๋ ๊ฒ ํ๋ฉด ํ ์คํธ๊ฐ ์ด ์์ญ ๋ด์์๋ง ๋ํ๋๋ฏ๋ก Path ๋ด์์ ์์๋๋ก ์คํฌ๋กค๋๋ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋์ผ๋ก, ๊ณผ์ ์ ์์์ผ๋ก ๋ณด๊ณ ์ถ๋ค๋ฉด ์๋ ํ๊ธ ์๋ง๊ณผ ํจ๊ป ์ค๋น๋์ด์์ต๋๋ค.
์ด๊ฒ์ผ๋ก ๋ด์ฉ์ ๋ง์นฉ๋๋ค! ํน์ ๊ถ๊ธํ์ ์ ๋๊ธ๋ก ๋ถํ๋๋ฆฝ๋๋ค.