Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
freem
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Openai/692d4200-adfc-800c-833d-f176379c9e46
Add languages
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{DISPLAYTITLE:WPF ๊ฐ์ด๋ ์ค๋ช ์์ฒญ}} ''This conversation was exported from ChatGPT''<ref>{{cite web|title=WPF ๊ฐ์ด๋ ์ค๋ช ์์ฒญ|url=https://chatgpt.com/share/692d4200-adfc-800c-833d-f176379c9e46|publisher=ChatGPT|access-date=2025-12-02}}</ref> == research == === User: WPF: A Beginner's Guide - Part 1 of n - CodeProject === WPF: A Beginner's Guide - Part 1 of n - CodeProject https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-1-of-n#comments-section WPF: A Beginner's Guide: Part 2 of n - CodeProject https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-2-of-n#comments-section WPF: A Beginner's guide: Part 3 of n - CodeProject https://www.codeproject.com/articles/WPF-A-Beginner-s-guide-Part-3-of-n#comments-section WPF: A Beginner's Guide - Part 4 of n - CodeProject https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-4-of-n#comments-section WPF: A Beginner's Guide - Part 5 of n - CodeProject https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-5-of-n#comments-section WPF: A Beginner's Guide - Part 6 of n - CodeProject https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-6-of-n#comments-section ์ฌ๊ธฐ์๋ ์ธ์ดํธ๋ค์ ์์ฃผ ์์ธํ ์ฒ์ฒํ ๋ฐ์ฌ๊ธ์์ค์ผ๋ก ์์ฃผ ์์ธํ๊ณ ๊ธธ๊ฒ ์ค๋ช ํด์ฃผ์ธ์ === Assistant: ๊ฐ WPF ์ด๋ณด์ ๊ฐ์ด๋Part 16 ๋งํฌ์ ๋ํด ์์ธํ ์ค๋ช ํด๋๋ฆด ์ ์์ต๋๋ค. === ๊ฐ WPF ์ด๋ณด์ ๊ฐ์ด๋(Part 1~6) ๋งํฌ์ ๋ํด ์์ธํ ์ค๋ช ํด๋๋ฆด ์ ์์ต๋๋ค. ๋ค์ ์ค ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๋ฆฌํด๋๋ฆด๊น์? # ๊ฐ ํํธ์ ๋ด์ฉ์ ์์ฝ ๋ฐ ํด์ค (์: ํต์ฌ ๊ฐ๋ , ์ฝ๋ ์์ ํด์ค) # ๊ฐ ํํธ์ ๋ด์ฉ์ ๋ํด ์ฌํ ํ์ต ์ค๋ช ๋ฐ ์์ฉ ๋ฐฉ๋ฒ # ์ ์ฒด ํํธ๋ฅผ ํตํฉํ WPF ํ์ต ๊ฐ์ด๋ ๋ฌธ์ ํ์ ๋ํ, ์ํ์๋ ์ธ์ด๊ฐ ํ๊ตญ์ด์ธ์ง ์์ด์ธ์ง๋ ์๋ ค์ฃผ์ธ์. === User: ํ๊ตญ์ด๋ก ๋ชจ๋๋ค === ํ๊ตญ์ด๋ก ๋ชจ๋๋ค === Assistant: ์ข์ต๋๋ค. === ์ข์ต๋๋ค. WPF: A Beginner's Guide ์๋ฆฌ์ฆ (Part 1๋ถํฐ 6๊น์ง)์ ๊ฐ ํํธ ๋ด์ฉ์ ํ๊ตญ์ด๋ก ์ฒ์ฒํ, ๋ฐ์ฌ๊ธ ์์ค์ ๊น์ด์ ์์ธํจ์ผ๋ก ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค. ๊ฐ ํํธ์ ํต์ฌ ๊ฐ๋ ๊ณผ ์์ ์ฝ๋์ ์๋ฏธ๋ฅผ ๋ถ์ํ๊ณ , WPF์ ๊ตฌ์กฐ์ ์ดํด ๋ฐ ์ค๋ฌด์ ํ์ฉ๊น์ง ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์์ ์ด ์๋ฃ๋๋ฉด ์๋ ค๋๋ฆด๊ฒ์. ๊ทธ๋์ ๋ค๋ฅธ ์ง๋ฌธ์ด๋ ์์ฒญ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋ง์ํด์ฃผ์ธ์! == gpt-? == === Assistant: WPF ์ด๋ณด์ ๊ฐ์ด๋ ์๋ฆฌ์ฆ 16๋ถ ์ฌ์ธต ํด์ค === === WPF ์ด๋ณด์ ๊ฐ์ด๋ ์๋ฆฌ์ฆ (1~6๋ถ) ์ฌ์ธต ํด์ค === '''WPF (Windows Presentation Foundation)'''์ .NET ํ๋ ์์ํฌ์ UI ํ๋ ์์ํฌ๋ก, ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ๋ถํ ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๊ฒ ํฉ๋๋ค. ๊ฐ๋ฐ์ Sacha Barber๋ CodeProject ์น์ฌ์ดํธ์ WPF์ ํต์ฌ ์ฃผ์ ๋ค์ ์ฌ์ฏ ๋ถ๋ถ์ ๊ฑธ์ณ ์ค๋ช ํ โWPF: A Beginnerโs Guideโ ์ฐ์ฌ๋ฌผ์ ์์ฑํ์ต๋๋คstackoverflow.com<ref>{{cite web|title=stackoverflow.com|url=https://stackoverflow.com/questions/29700/can-someone-point-me-to-some-guides-for-wpf#:~:text=Sacha%20Barber%20has%20a%20great,that%20you%20can%20check%20out|publisher=stackoverflow.com|access-date=2025-12-02}}</ref>. ์ด ๊ฐ์ด๋์์๋ ํด๋น ์ฐ์ฌ๋ฌผ์ ๋ด์ฉ์ ๊ฐ ๋ถ๋ณ๋ก ๊น์ด ์๊ณ ์์ธํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ณด์ ์์ค์ ์ฃผ์ ๋ค์ ๋ค๋ฃจ์ง๋ง, ๋ฐ์ฌ๊ณผ์ ์์ค์ ์์ธํจ์ผ๋ก ๊ฐ๋ ๊ณผ ์๋ฆฌ๋ฅผ ์ฒ์ฒํ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ ์ฒด ๋ด์ฉ์ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ํ๊ตญ์ด๋ก ํ์ด์ฐ๋, ํ์ํ ๊ฒฝ์ฐ ์์ด(์๋ฌธ) ์ฉ์ด๋ฅผ ํจ๊ป ๋ณ๊ธฐํ๊ฒ ์ต๋๋ค. ==== Part 1: WPF ๋ ์ด์์ ์์คํ (Layout) ==== Part 1์์๋ WPF์ ๋ ์ด์์ ์์คํ ์ ๋ฐ์ ์๊ฐํฉ๋๋คstackoverflow.com<ref>{{cite web|title=stackoverflow.com|url=https://stackoverflow.com/questions/29700/can-someone-point-me-to-some-guides-for-wpf#:~:text=,into%20WPF%20Styles%20And%20Templates|publisher=stackoverflow.com|access-date=2025-12-02}}</ref>. WPF์์ ๋ ์ด์์์ด๋ ์ปจํ ์ด๋(ํจ๋) ๋ด์์ ์์ UI ์์๋ค์ ๋ฐฐ์นํ๋ ๋ฉ์ปค๋์ฆ์ ๋ปํฉ๋๋ค. WPF์๋ ๋ค์ํ ๋ ์ด์์ ํจ๋์ด ์ค๋น๋์ด ์์ผ๋ฉฐ, ๊ฐ ํจ๋์ ๊ณ ์ ํ ๋ฐฐ์น ์ ๋ต์ ๊ฐ์ง๋๋ค. WPF ๋ ์ด์์์ '''์ธก์ (measure)'''๊ณผ '''๋ฐฐ์น(arrange)'''์ ๋ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ค๋ ์ด๋ก ์ ๋ฐฐ๊ฒฝ์ด ์์ง๋ง, ์ฌ๊ธฐ์๋ ์ฃผ๋ก ์ค๋ฌด์์ ์์ฃผ ์ฐ์ด๋ ๊ธฐ๋ณธ ํจ๋๋ค์ ๋์์ ์ค์ ์ ์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค. ๋ํ ๋ ์ด์์ ๊ด๋ จ ๊ณตํต ์์ฑ(์: Margin, Alignment)๊ณผ ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ, ์ฌ์ฉ์ ์ ์ ํจ๋์ ๋ํ ๊ฐ์๋ ํจ๊ป ๋ค๋ฃจ๊ฒ ์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=Image%E6%9C%AC%E6%96%87%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D%E4%BA%86Windows%20Presentation%20Foundation%20|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. Margin๊ณผ ์ ๋ ฌ: ๋ชจ๋ WPF ์ปจํธ๋กค์๋ Margin ์์ฑ์ด ์์ด, ์ฃผ๋ณ ์์์์ ์ฌ๋ฐฑ์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Margin="5,5,5,5"๋ผ๊ณ ํ๋ฉด ํด๋น ์ปจํธ๋กค์ ์ข์ฐ์ํ์ ๊ฐ๊ฐ 5ํฝ์ ์ ์ฌ๋ฐฑ์ ๋๋ผ๋ ์๋ฏธ์ ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋ํ ์ปจํธ๋กค์ ๋ถ๋ชจ ์ปจํ ์ด๋ ๋ด์์ ํน์ ๋ฐฉํฅ์ผ๋ก ์ ๋ ฌํ ๋๋ HorizontalAlignment๋ VerticalAlignment ์์ฑ์ ์ฌ์ฉํฉ๋๋ค. Margin๊ณผ ์ ๋ ฌ ์์ฑ์ ์ด๋ค ๋ ์ด์์ ํจ๋ ์์ ์์ด๋ ์ ์ฉ๋๋ฉฐ, ์ผ๊ด๋ UI ๋ฐฐ์น๋ฅผ ์ํด ์ค์ํฉ๋๋ค. WPF์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๋ ์ด์์ ํจ๋๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-1-of-n?fid=980228&%3Bdf=90&%3Bmpp=25&%3Bsort=Position&%3Bspc=Relaxed&%3Bselect=2472424&%3Btid=2508205#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%20,Please|publisher=codeproject.com|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=Image%E6%9C%AC%E6%96%87%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D%E4%BA%86Windows%20Presentation%20Foundation%20|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>: * Canvas (์บ๋ฒ์ค) โ ๊ฐ์ฅ ๋จ์ํ ํจ๋๋ก, ์ ๋ ์ขํ ๊ธฐ๋ฐ ๋ฐฐ์น๋ฅผ ์ ๊ณตํฉ๋๋ค. Canvas ๋ด๋ถ์ ์์ ์์๋ ๊ฐ์ Canvas.Left, Canvas.Top ๋ฑ์ '''์ฒจ๋ถ ์์ฑ(attached property)'''์ผ๋ก X,Y ์ขํ๋ฅผ ์ง์ ํด ๊ณ ์ ์์น์ ๋์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์ฆ Canvas๋ ์์ ์ด ๋ด์ ์์๋ค์ ์์น๋ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์ง์ ๋ ์ขํ์ ๊ทธ๋๋ก ๊ทธ๋ฆฌ๋ ์ญํ ๋ง ํฉ๋๋ค. ๋ง์ฝ ๋ ์์๊ฐ ๊ฒน์น ๊ฒฝ์ฐ ๋๊ตฌ๋ฅผ ์์ ๊ทธ๋ฆด์ง Panel.ZIndex ์์ฑ์ผ๋ก ๊ฒฐ์ ํ ์ ์์ต๋๋ค (ZIndex ๊ฐ์ด ํฐ ์์๊ฐ ์์ผ๋ก ๋์ด)blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=Canvas|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. Canvas๋ ์ขํ๋ฅผ ์ผ์ผ์ด ์ง์ ํด์ผ ํ๋ฏ๋ก ๋ฐ์ํ ๋ ์ด์์์๋ ๋ถ์ ํฉํ์ง๋ง, ์์ ๋ก์ด ์ ๋ ๋ฐฐ์น๊ฐ ํ์ํ ๋ ์ ์ฉํฉ๋๋ค. Canvas ํจ๋ ์์: ํฐ์ Canvas์ ํ๋ ์ฌ๊ฐํ๊ณผ ์ด๋ก ์์ ๋ฐฐ์นํ ๋ชจ์ต. ๊ฐ ์์๋ Canvas์ ์ฒจ๋ถ ์์ฑ์ผ๋ก ์ขํ๋ฅผ ์ง์ ํด ๋์์ผ๋ฉฐ, ์ด๋ก์ ์์ <code>Panel.ZIndex</code>๋ฅผ ๋์ฌ ํ๋ ์ฌ๊ฐํ ์์ ๊ทธ๋ ค์ง๋๋ก ํ์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=Canvas|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CRectangle%20Fill%3D,1|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. * StackPanel (์คํํจ๋) โ ์์ง ๋๋ ์ํ์ผ๋ก ์ฐ์ ๋ฐฐ์นํ๋ ํจ๋์ ๋๋ค. StackPanel์ ์ด๋ฆ์ฒ๋ผ ์์ ์์๋ค์ ์๋ฏ์ด ๋์ดํ๋ฉฐ, Orientation ์์ฑ์ผ๋ก ์ธ๋ก ์๊ธฐ(Vertical) ๋๋ ๊ฐ๋ก ๋์ด(Horizontal)์ ์ ํํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์๋ฅผ ๋ค์ด Orientation="Vertical"์ด๋ฉด ๊ฐ ์ปจํธ๋กค์ ์์์ ์๋๋ก ์ฐจ๋ก๋ก ๋ฐฐ์นํ๊ณ , Horizontal์ด๋ฉด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์ค์ ๋ฐฐ์นํฉ๋๋ค. StackPanel์ ๊ตฌํ์ด ๋จ์ํ์ฌ ๊ฒฝ๋์ด๊ณ , ์์ ์์ญ์ ์ฌ๋ฌ ์ปจํธ๋กค์ ๋์ดํ๊ฑฐ๋ ์ ๋ ฌํ ๋ ์ ์ฉํฉ๋๋ค. ๋ค๋ง ๋ชจ๋ ๋ด์ฉ์ ํ ์ค๋ก ๋ฐฐ์นํ๊ธฐ ๋๋ฌธ์, ๋ถ๋ชจ ์์ญ์ ๋์ด๊ฐ๋ ๋ถ๋ถ์ ๋ณด์ด์ง ์๊ฒ ๋๋ฉฐ(์คํฌ๋กค ๊ธฐ๋ฅ ์์), ๋ณด๋ค ์ ์ฐํ ๋ฐฐ์น๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ค์์ ์ค๋ช ํ ํจ๋๋ค์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. StackPanel ์์: ํ์ ๋ง๋๋ก ๋ณด์ด๋ ๋ ๊ฐ์ ๋ฒํผ์ ์์ง์ผ๋ก ์์ ์ฌ๋ฆฐ ๋ชจ์ต. <code>Orientation="Vertical"</code>์ธ StackPanel์ ์ฌ์ฉํ์ฌ โIm Top of Stackโ ๋ฒํผ์ด ์์, โIm Bottom Of Stackโ ๋ฒํผ์ด ์๋ ๋ฐฐ์น๋์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CStackPanel%20Margin%3D,%3C%2FStackPanel|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. * WrapPanel (๋ํํจ๋) โ '''ํ ์ค๋ก ์์๋ค์ ๋ฐฐ์นํ๋ ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋์ผ๋ก ์ค๋ฐ๊ฟ(wrap)'''ํ๋ ํจ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ๋ก ๋ฐฉํฅ WrapPanel์ ํญ์ด ๊ณ ์ ๋ ์ฌ๋ฌ ์ฌ๊ฐํ์ ๋ฐฐ์นํ๋ฉด, ํจ๋ ๋๋น๋ฅผ ์ด๊ณผํ๋ ์์ ์ ๋ค์ ์ค๋ก ๋์ด๊ฐ ๋ฐฐ์น๋ฅผ ์ด์ด๊ฐ๋๋ค. WrapPanel์ ๊ธฐ๋ณธ Orientation์ ๊ฐ๋ก์ด์ง๋ง ์ธ๋ก๋ก ์ค์ ํ ์๋ ์์ต๋๋ค. WrapPanel์ Windows Forms์ FlowLayoutPanel๊ณผ ์ ์ฌํ๋ฉฐ, ๋ฐ์ํ์ผ๋ก ์ฝํ ์ธ ๋ฅผ ํ๋ ค ๋ฐฐ์นํ๋ ๋ฐ ํ์ฉ๋ฉ๋๋ค. ๊ทธ ๋์์ ํ๋ง๋๋ก ํํํ๋ฉด โ๋ด์ฉ๋ฌผ์ ์์์ ๊ฐ์ธ์ ์ ๋ ฌํ๋ค(์ค๋ฐ๊ฟ ๋ฐฐ์นํ๋ค)โ๋ ๊ฒ์ ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋ด๋ถ์ ์ผ๋ก ํน๋ณํ ์ฌ๋ฐฐ์น ๋ก์ง์ ์ถ๊ฐํ์ง ์๊ณ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๋ ์ค๋ง ๋ฐ๊พธ๋ ๋จ์ํ ๋ฐฉ์์ด์ด์, ๋ ์ด์์์ ํฌ๊ฒ ๊ฐ์ญํ์ง ์์ต๋๋ค. WrapPanel ์์: ํ๋ ์ ์ฌ๊ฐํ 10๊ฐ๊ฐ WrapPanel ๋ด์ ๊ฐ๋ก๋ก ๋์ด๋๋ค๊ฐ ๊ณต๊ฐ์ด ๋ชจ์๋ผ๋ฉด ์๋ ์ค๋ฐ๊ฟ๋ ๋ชจ์ต. ์ฒซ ํ์ 6๊ฐ, ๋์งธ ํ์ 4๊ฐ์ ์ฌ๊ฐํ์ด ์ฑ์์ก์ต๋๋ค. WrapPanel์ ์ด์ฒ๋ผ ์์์ด ๋์น ๊ฒฝ์ฐ ์๋ ํ์ผ๋ก โ๊ฐ์ธ์โ ๋ฐฐ์นํ๋ ์ปจํ ์ด๋์ผ ๋ฟ, ๋ณ๋์ ํฌ๊ธฐ ์กฐ์ ์ ํ์ง ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%E8%A7%A3%E9%87%8A%E4%B8%BA%3BIt%20simply%20wraps%20its%20contents|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CWrapPanel%20Margin%3D,60|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. * DockPanel (๋ํนํจ๋) โ ํ๋ฉด์ '''๋ชจ์๋ฆฌ(์/ํ/์ข/์ฐ)์ ์์๋ค์ ๋ถ์ฌ ๋ฐฐ์น(dock)'''ํ๋ ํจ๋์ ๋๋ค. ํํ ์ฐฝ ์ ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ์ปจํ ์ด๋๋ก ์ฌ์ฉ๋๋ฉฐ, ์๋จ์ ๋ฉ๋ด ๋ฐ, ์ข์ธก์ ๋ด๋น๊ฒ์ด์ ๋ฉ๋ด, ์ค์์ ๋ด์ฉ, ํ๋จ์ ์ํ ํ์์ค ๋ฑ์ ๋ฐฐ์นํ๋ ์์ ์ ํ์ ์ธ ๋ ์ด์์์ ๊ตฌํํ๊ธฐ์ ์ข์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๊ฐ ์์์ DockPanel.Dock ์ฒจ๋ถ ์์ฑ์ผ๋ก ๋ถ์ผ ๋ฐฉํฅ(Top, Bottom, Left, Right)์ ์ง์ ํฉ๋๋ค. LastChildFill ์์ฑ๋ ์ค์ํ๋ฐ, ์ด ๊ฐ์ด True์ด๋ฉด ๋ง์ง๋ง ์์ ์์๋ฅผ ๋จ์ ๋น ๊ณต๊ฐ ์ ์ฒด์ ํ๋ํ์ฌ ์ฑ์ฐ๋ ๋์์ ํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%E5%8F%8ALastChildFill%EF%BC%8C%E5%90%8E%E8%80%85%E4%BC%9A%E6%94%B9%E5%8F%98%E5%8E%9F%E6%9D%A5%E7%9A%84%E5%B8%83%E5%B1%80%EF%BC%88%E5%A1%AB%E6%BB%A1%E5%89%A9%E4%B8%8B%E7%9A%84%E7%A9%BA%E9%97%B4%EF%BC%89%EF%BC%8C%E5%A6%82%E6%9E%9C%E8%AE%BE%E4%B8%BAtrue%E7%9A%84%E8%AF%9D%E3%80%82|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์๋ฅผ ๋ค์ด ๋ ๊ฐ์ ์์์ ๊ฐ์ง DockPanel์์ ์ฒซ ๋ฒ์งธ ์์์ Top์ ๋ํนํ๋ฉด ๋ ๋ฒ์งธ ์์์ ์๋์ผ๋ก ๋๋จธ์ง ๊ณต๊ฐ์ ๋ชจ๋ ์ฐจ์งํฉ๋๋ค (LastChildFill=True์ผ ๋)blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%E5%8F%8ALastChildFill%EF%BC%8C%E5%90%8E%E8%80%85%E4%BC%9A%E6%94%B9%E5%8F%98%E5%8E%9F%E6%9D%A5%E7%9A%84%E5%B8%83%E5%B1%80%EF%BC%88%E5%A1%AB%E6%BB%A1%E5%89%A9%E4%B8%8B%E7%9A%84%E7%A9%BA%E9%97%B4%EF%BC%89%EF%BC%8C%E5%A6%82%E6%9E%9C%E8%AE%BE%E4%B8%BAtrue%E7%9A%84%E8%AF%9D%E3%80%82|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. DockPanel์ ์ฌ์ฉํ ๋๋ ๋ํน ์์์ ์ ์ํด์ผ ํฉ๋๋ค. ๋จผ์ ์ถ๊ฐ๋ ์์๋ถํฐ ์ฐจ๋ก๋๋ก ๊ฐ์ฅ์๋ฆฌ์ ๋ถ๊ณ , ๋ง์ง๋ง ๋จ์ ๊ณต๊ฐ์ด ์ตํ ์์์๊ฒ ํ ๋น๋๋ฏ๋ก, ์ผ๋ฐ์ ์ผ๋ก ์๋จ ๋ฉ๋ด -> ํ๋จ ์ํ๋ฐ -> ์ข์ธก ํจ๋ -> ์ค์ ์ฝํ ์ธ ์์ผ๋ก XAML์ ์ ์ธํฉ๋๋ค. DockPanel์ ์ด๋ฌํ ๋ ์ด์์ ํจํด์ ์ฝ๋ ํ ์ค ์์ด ์ฝ๊ฒ ๋ฌ์ฑํ๊ฒ ํด์ฃผ๋ฏ๋ก WPF์์๋ ๋ง์ด ์ฐ์ ๋๋ค. DockPanel ์์: ํ๋์ ๋ง๋(์)์ ์ฃผํฉ์ ์์ญ(์๋)์ ๊ฐ์ง ์ฐฝ. ์ฒซ ๋ฒ์งธ Rectangle์ <code>DockPanel.Dock="Top"</code>์ผ๋ก ์๋จ์ ๋์ด 20px ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ , ๋ ๋ฒ์งธ Rectangle์ ๋ํน ๋ฐฉํฅ์ ์ง์ ํ์ง ์์ ์๋์ผ๋ก ๋จ์ ๊ณต๊ฐ ์ ์ฒด(์ฃผํฉ์ ๋ถ๋ถ)๋ฅผ ์ฑ์ ์ต๋๋ค (<code>LastChildFill=True</code>์ธ ๊ฒฝ์ฐ)blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=DockPanel%E7%94%A8%E9%80%94%E6%AF%94%E8%BE%83%E5%B9%BF%EF%BC%8C%E5%8F%AF%E4%BB%A5%E4%BD%9C%E4%B8%BA%E7%AA%97%E4%BD%93%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%AE%B9%E5%99%A8%EF%BC%8C%E5%AE%9E%E7%8E%B0%E5%A6%82%EF%BC%9Amenu%E5%9C%A8%E4%B8%8A%EF%BC%8C%E5%B7%A6%E5%8F%B3%E5%86%85%E5%AE%B9%E6%98%BE%E7%A4%BA%E5%8C%BA%E5%9F%9F%EF%BC%8C%E5%8A%A0%E5%BA%95%E4%B8%8B%E4%B8%80%E4%B8%AA%E7%8A%B6%E6%80%81%E6%98%BE%E7%A4%BA%E6%A0%8F%E3%80%82%E6%AF%94%E8%BE%83%E9%87%8D%E8%A6%81%E7%9A%84%E5%B1%9E%E6%80%A7%E6%98%AFDockPanel|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=Width%3D|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. '' Grid (๊ทธ๋ฆฌ๋) โ ํ๊ณผ ์ด๋ก ์ด๋ฃจ์ด์ง ๊ฒฉ์(grid) ํํ๋ก ์์๋ค์ ๋ฐฐ์นํ๋, ๊ฐ์ฅ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ํจ๋์ ๋๋ค. Grid๋ HTML์ <table> ๋ ์ด์์๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ(RowDefinitions)๊ณผ ์ด(ColumnDefinitions)์ ๋ฏธ๋ฆฌ ์ ์ํ ๋ค ๊ฐ ์์ ์์์ ํ/์ด ์์น๋ฅผ ์ง์ ํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CRectangle%20Fill%3D,2|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. XAML์์ Width="''" ๋๋ Height="''"์ ๊ฐ์ด ๋ณํ('')๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ณ ํฌ๊ธฐ๋ฅผ ๋ปํ๋๋ฐ, ์์ปจ๋ ์ด ์ ์์์ Width="''"๋ ๋จ์ ๊ณต๊ฐ์ 1๋ฐฐ์จ๋ก, Width="2''"๋ ๋จ์ ๊ณต๊ฐ์ 2๋ฐฐ ๋น์จ๋ก ์ฐจ์งํ๋ผ๋ ์๋ฏธ์ ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CGrid.ColumnDefinitions%3E%20%3CColumnDefinition%20Width%3D,2|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋ค์ XAML ์์๋ฅผ ๋ณด๋ฉด ์ธ ๊ฐ์ ์ด์ ์ ์ํ๋๋ฐ, ์ฒซ ์ด์ ๊ณ ์ ํญ 40px, ๋๋จธ์ง ๋ ์ด์ ๋จ์ ๊ณต๊ฐ์ 1:2 ๋น์จ๋ก ๋๋๋๋ก ์ค์ ํ์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CGrid.ColumnDefinitions%3E%20%3CColumnDefinition%20Width%3D,2|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=match%20at%20L222%20,2|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ํ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก *์ ์ฌ์ฉํด ๊ฐ๋ณ ๋์ด๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. Grid ๋ด ์์์ Grid.Row="r" Grid.Column="c" ์ฒจ๋ถ ์์ฑ์ผ๋ก ๋ฐฐ์น ์์น๋ฅผ ์ง์ ํ๋ฉฐ, Grid.RowSpan์ด๋ Grid.ColumnSpan์ ํตํด ํ๋์ ์์๊ฐ ์ฌ๋ฌ ํ์ด๋ ์ด์ ๋ณํฉํ์ฌ ์ฐจ์งํ๋๋ก ํ ์๋ ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=match%20at%20L201%20Grid|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CRectangle%20Fill%3D,2|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. Grid๋ ์ค์ฒฉ๋ ๋ ์ด์์์ด๋ ๋ณต์กํ UI ๋ฐฐ์น์ ํ์์ ์ด์ง๋ง, ๋ค๋ฅธ ํจ๋์ ๋นํด ๋ฌด๊ฒ๊ณ ๋ณต์กํ๋ฏ๋ก ํ์ ์ด์์ ๊ฒฉ์ ๋ถํ ์ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค (๋ณต์กํ Grid๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ฉด ์ธก์ /๋ฐฐ์น ์ฐ์ฐ ๋น์ฉ์ด ๋์ด๋ฉ๋๋ค). Grid ์์: ์ฒซ ๋ฒ์งธ ์ด(40px ๋๋น)์ ์์์ ์ง์ฌ๊ฐํ, ๋ ๋ฒ์งธ+์ธ ๋ฒ์งธ ์ด(๋จ์ ๊ณต๊ฐ์ 1:2 ๋น์จ ๊ฒฐํฉ)์ ๋ถํ์ ์ง์ฌ๊ฐํ์ด ๋ฐฐ์น๋ ๋ชจ์ต. ์ด์ฒ๋ผ Grid๋ ์ ๊ฐ๋ ์ผ๋ก UI๋ฅผ ๋ฐฐ์นํ๋ฉฐ, ๋ณํ(<code>*</code>)๋ฅผ ์ฌ์ฉํ ์๋์ ํฌ๊ธฐ ์ง์ ๊ณผ <code>ColumnSpan</code>์ ํตํ ์ด ํฉ์น๊ธฐ ๋ฑ์ด ๊ฐ๋ฅํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%E6%AF%94%E8%BE%83%E5%A4%8D%E6%9D%82%EF%BC%8C%E7%B1%BB%E4%BC%BC%E4%BA%8E%E4%B8%80%E4%B8%AAHTML%E4%B8%AD%E7%9A%84table%E6%8E%A7%E4%BB%B6%EF%BC%8C%E5%8F%AF%E4%BB%A5%E6%8C%87%E5%AE%9Arow%EF%BC%8Ccolumn%E6%95%B0%E9%87%8F%E5%8F%8A%E8%B7%A8%E8%A1%8C%E8%B7%A8%E5%88%97%EF%BC%9B%E5%90%8C%E6%97%B6%E8%BF%98%E6%9C%89%E4%B8%80%E4%B8%AA%E6%AF%94%E8%BE%83%E5%A5%87%E6%80%AA%E7%9A%84%E8%AF%AD%E6%B3%95%E6%A0%87%E8%AF%86|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3CRectangle%20Fill%3D,2|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์ด์ ์ดํด๋ณธ ๊ธฐ๋ณธ ํจ๋๋ค์ ์กฐํฉํ๋ฉด ๋ณต์กํ ์ฐฝ ๋ ์ด์์๋ ์์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, DockPanel์ ์ต์์ ์ปจํ ์ด๋๋ก ์ฐ๊ณ ์๋จ์๋ ๋ฉ๋ด(Menu, Dock=Top), ํ๋จ์๋ ์ํ๋ฐ(StackPanel, Dock=Bottom), ์ข์ธก์๋ ๋ฒํผ ๋ฉ๋ด(StackPanel, Dock=Left), ์ค์์๋ Grid(LastChildFill์ ํตํด ์๋ ์ฑ์)๋ฅผ ๋ฐฐ์นํ๋ฉด ์ ํ์ ์ธ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ UI๋ฅผ ๋ง๋ค ์ ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%E8%80%83%E8%99%91%E4%B8%8A%E9%9D%A2%E6%89%80%E8%AF%B4%E7%9A%84WinForm%E7%BB%8F%E5%85%B8%E7%95%8C%E9%9D%A2%EF%BC%9A|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%3C%21,%3C%2FStackPanel|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์ค์ ๋ก Part 1 ๊ธ์ ๋ง์ง๋ง์๋ ์ด๋ฌํ ์์๋ค์ ๋ชจ๋ ์กฐํฉํ โPutting It All Togetherโ ์์ ๊ฐ ์ ์๋์ด ์๋๋ฐ, XAML๋ง์ผ๋ก Windows Forms์ ๋์ผํ ๋ ์ด์์์ ๊ตฌํํ์์ ๋ณด์ฌ์ค๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%E8%80%83%E8%99%91%E4%B8%8A%E9%9D%A2%E6%89%80%E8%AF%B4%E7%9A%84WinForm%E7%BB%8F%E5%85%B8%E7%95%8C%E9%9D%A2%EF%BC%9A|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=%E8%AE%BE%E8%AE%A1DockPanel%E6%97%B6%E4%BE%9D%E6%AC%A1%E6%98%AFMenu,Dock%3DRight%EF%BC%89%E3%80%82|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. WPF์ ๋ ์ด์์ ์์คํ ์ ์ด์ฒ๋ผ ์ ์ฐํ๋ฉด์๋ ๊ฐ๋ ฅํ์ง๋ง, ๊ณผ๋ํ ์ค์ฒฉ(์: ๋ถํ์ํ๊ฒ Grid ์์ Grid๋ฅผ ์ฌ๋ฌ ๊ฒน ์ฌ์ฉํ๋ ๋ฑ)์ ํผํฌ๋จผ์ค๋ฅผ ์ ํ์ํฌ ์ ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80280349#:~:text=Image%E6%9C%AC%E6%96%87%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D%E4%BA%86Windows%20Presentation%20Foundation%20|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋ฐ๋ผ์ ๋ณต์กํ UI๋ ๋ ์ด์์์ ๋จ์ํํ๊ฑฐ๋, ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ์ ํจ๋์ ๋ง๋ค์ด ์ต์ ํํ๋ ๊ฒ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. WPF์์๋ Panel์ ์์๋ฐ์ MeasureOverride์ ArrangeOverride ๋ฉ์๋๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ์ปค์คํ ๋ ์ด์์ ๋์์ ๊ฐ๋ ํจ๋์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ด๋ ๊ณ ์ ํ ๋ฐฐ์น ๋ ผ๋ฆฌ๊ฐ ํ์ํ ๋ ํ์ฉ๋ฉ๋๋ค. ==== Part 2: XAML๊ณผ ์ฝ๋ ๋นํ์ธ๋, WPF ๋ฆฌ์์ค ==== Part 2์์๋ XAML๊ณผ ์ฝ๋์ ์ญํ ๋ถ๋ฆฌ ๊ทธ๋ฆฌ๊ณ '''WPF ๋ฆฌ์์ค(Resources)'''์ ๋ํด ๋ค๋ฃน๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/Articles/23047/WPF-A-Beginner-s-Guide-Part-2-of-n?fid=983138&df=90&mpp=25&sort=Position&view=Normal&spc=Relaxed&prof=True&select=3551190&fr=1#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%3A%20Part,NET%29|publisher=codeproject.com|access-date=2025-12-02}}</ref>. WPF ์ธํฐํ์ด์ค๋ XML ๊ธฐ๋ฐ ์ ์ธ ์ธ์ด์ธ '''XAML (Extensible Application Markup Language)'''๋ก ๊ธฐ์ ๋๊ณ , ์ฌ๊ธฐ์ ๋์ํ๋ ์ฝ๋-๋นํ์ธ๋(code-behind) ํ์ผ(C# ๋๋ VB.NET ์ฝ๋)์ด ์กด์ฌํฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ์ ํต์ ์ธ MVC ํจํด์ ๋น์ ํ ์ ์์ต๋๋ค. ๋ทฐ(View) ์ญํ ์ XAML์ด ๋ด๋นํ๊ณ ๋ชจ๋ธ(Model)+์ปจํธ๋กค๋ฌ(Controller) ์ญํ ์ ์ฝ๋๋นํ์ธ๋๊ฐ ๊ฒฐํฉํ์ฌ ์ํํ๋ ํํ๋ก ๋ณผ ์ ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=,Xaml|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. XAML์ ์ฌ์ฉํจ์ผ๋ก์จ UI ํํ๊ณผ ๋์ ๋ก์ง์ ๋ถ๋ฆฌ๊ฐ ๋ช ํํด์ ธ, ๊ฐ๋ฐ์๊ฐ ํ๋ฉด ๋์์ธ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. (์ด ์ ์ ASP.NET์ Markup๊ณผ Code-behind ๋ถ๋ฆฌ์๋ ์ ์ฌํฉ๋๋ค.) ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์์ด๋์ ๊ฐ๋ฐ์์ ์์ ๋ถ๋ด์ด ์์ํด์ง๊ณ , UI๋ฅผ ์์ ํด๋ ํต์ฌ ๋ก์ง์๋ ์ํฅ์ ์ฃผ์ง ์๋ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ ์ ์์ต๋๋ค. XAML ํ์ผ๊ณผ ์ฐ๊ฒฐ๋ ์ฝ๋๋นํ์ธ๋ ํ์ผ(์: .xaml.cs)์์๋ ํ๋ฉด ๋์์ ๊ตฌํํฉ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์ฝ๋๋นํ์ธ๋์์ ๋ด๋นํด์ผ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=,Code|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>: * ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ ๊ตฌํ: ๋ฒํผ ํด๋ฆญ, SelectionChanged ๋ฑ ๋ชจ๋ UI ์ด๋ฒคํธ์ ๋ํ ์ฒ๋ฆฌ ์ฝ๋๋ ๋ฐ๋์ ์ฝ๋์์ ์์ฑํฉ๋๋ค. (XAML์์๋ ์ด๋ฒคํธ์ ํด๋นํ๋ ๋ฉ์๋ ์ด๋ฆ๋ง ์ฐ๊ฒฐํ๊ณ , ์ค์ง ๋ก์ง์ C#/VB ๋ฉ์๋๋ก ๊ตฌํ) * ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฐ์ฐ: ๋ฃจํ๋ ์ํ ๊ณ์ฐ, ๋นUI ํด๋์ค์ ๋ฉ์๋ ํธ์ถ ๋ฑ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํฉ๋๋ค. ๋ทฐ(UI)๋ ๊ฐ๋ฅํ ํ โ๋ฉ์ฒญํโ ํํ๋ก ์ ์งํ๊ณ , ๋ณต์กํ ๊ณ์ฐ์ด๋ ์ฒ๋ฆฌ ๋ก์ง์ ์ฝ๋์์ ์คํํฉ๋๋ค. * ์ ๋ ฅ ๊ฐ ๊ฒ์ฆ: ํผ ์ ๋ ฅ ๋ฑ์ ๊ฒ์ฆ(validation) ๋ก์ง์ ๊ตฌํํฉ๋๋ค. (WPF์ ValidationRule์ XAML๋ก ์ง์ ํ ์๋ ์์ง๋ง, ๋ณต์กํ ๊ฒ์ฆ์ ์ฝ๋ ์ชฝ์์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.) * ์ค๋ฅ ๋ฐ ์์ธ ์ฒ๋ฆฌ: XAML์์๋ try-catch ๊ฐ์ ์์ธ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ์์ธ ์ํฉ์ ๋ํ ์ฒ๋ฆฌ๋ ์ฝ๋์์ ์ํํฉ๋๋ค. (์: ์น ์๋น์ค ํธ์ถ ์ ํ์์์ ์์ธ ์ฒ๋ฆฌ ๋ฑ) * ๊ธฐํ ์ ์ด ํ๋ฆ: ์ฌ๊ท ํธ์ถ์ด๋ ์ฐ๋ ๋ ์ ์ด ๋ฑ UI ํ์ ์ด์ธ์ ๋ชจ๋ ์ ์ด ํ๋ฆ์ ์ฝ๋์์ ๋ด๋นํฉ๋๋ค. ์์ฝํ๋ฉด, XAML์ ์ค์ง UI ํํ๊ณผ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ ์ธ ๋ฑ์๋ง ๊ด์ฌํ๊ณ , ๊ทธ ์ธ์ ๋ชจ๋ ๋์ ์ธ ๋ถ๋ถ์ ์ฝ๋๊ฐ ๋งก๋๋ค๊ณ ์ดํดํ ์ ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=,Code|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ UI์ ๋ก์ง์ด ๊น๋ํ ๋ถ๋ฆฌ๋์ด ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ด ๋์์ง๋๋ค. ์ด์ XAML ์ธก์ ๊ตฌ์ฒด ๋ด์ฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. XAML์์๋ ํด๋์ค๋ ์ปจํธ๋กค์ ์ง์ ์ฌ์ฉํ ์๋ ์๋๋ฐ, ์ด๋ XML ๋ค์์คํ์ด์ค ์ ์ธ์ ํตํด .NET ํด๋์ค๋ค์ XAML์ ๋ ธ์ถํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก <Window ... xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...>์ ํฌํจ๋ WPF ๊ธฐ๋ณธ ๋ค์์คํ์ด์ค์ ์ปจํธ๋กค๋ค์ ๋ณ๋ ์ ์ธ ์์ด ์ฌ์ฉํ ์ ์์ง๋ง, ์ฌ์ฉ์๊ฐ ์ ์ํ ์ปจํธ๋กค์ด๋ .NET์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค ๋ฑ์ XAML์์ ์ฐ๋ ค๋ฉด xmlns:๋ก ๋ค์์คํ์ด์ค๋ฅผ ์ถ๊ฐํด์ค์ผ ํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E5%9C%A8C|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=xmlns%3Alocal%3D%22clr|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์๋ฅผ ๋ค์ด ํ์ฌ ํ๋ก์ ํธ์ ๋ค์์คํ์ด์ค๊ฐ WPF_Tour_Beginners_Part_2๋ผ๋ฉด <Window ... xmlns:local="clr-namespace:WPF_Tour_Beginners_Part_2;assembly=">์ฒ๋ผ ์ ์ธํ๊ณ <local:UserControl2/> ํํ๋ก ์ปค์คํ UserControl์ ๋ฐฐ์นํ ์ ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=Assembly%20Ref1%EF%BC%9AUsing%20%C2%A0a%20Local%20,NameSpace%EF%BC%89Control%20in%20a%20Window|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E6%88%91%E4%BB%AC%E5%8F%AF%E4%BB%A5%E8%BF%99%E6%A0%B7%E4%BD%BF%E7%94%A8UserControl%EF%BC%8C%E5%A6%82|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์ธ๋ถ ์ด์ ๋ธ๋ฆฌ์ ์ปจํธ๋กค๋ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก xmlns์ ์ด์ ๋ธ๋ฆฌ๋ช ์ ํฌํจํ์ฌ ๋ฑ๋กํ๊ณ ์ฌ์ฉํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=Assembly%20Ref%203%3A%20Using%20an,Control%20in%20a%20Window|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E5%A6%82%E5%89%8D%E9%9D%A2%E6%89%80%E8%A7%81%EF%BC%8C%E5%B0%B1%E6%98%AF%E5%9C%A8xmlns%E4%B8%AD%E6%B7%BB%E5%8A%A0Assembly%E7%9A%84%E5%90%8D%E5%AD%97%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E5%85%A8%E5%90%8D%EF%BC%9A|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. .NET ๊ธฐ๋ณธ ํด๋์ค(์: System.Collections.Hashtable)๋ฅผ XAML์์ ์ธ์คํด์คํํ ์๋ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ์๋ ํด๋น ๋ค์์คํ์ด์ค System.Collections๋ฅผ xmlns์ ๋งคํํ ๋ณ์นญ(collections ๋ฑ)์ผ๋ก ์ ์ธํ ํ <collections:Hashtable> ํ๊ทธ๋ฅผ ์จ์ฃผ๋ฉด ๋ฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E5%A6%82%E6%9E%9C%E6%88%91%E4%BB%AC%E6%83%B3%E5%9C%A8XAML%E4%B8%AD%E4%BD%BF%E7%94%A8%E4%BB%A5%E4%B8%8B%E7%B1%BB%EF%BC%9A|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E6%8E%A5%E4%B8%8B%E6%9D%A5%E5%B0%B1%E6%98%AF%E4%BD%BF%E7%94%A8%EF%BC%9A|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์ด์ฒ๋ผ XAML์ CLR ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑ ๋ฐ ๊ตฌ์ฑํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง๋ฉฐ, XAML ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ์ง์ํฉ๋๋ค. XAML ๋ฌธ๋ฒ์ ์ค์ํ ์์๋ก '''๋งํฌ์ ํ์ฅ (Markup Extensions)'''์ด ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋งํฌ์ ํ์ฅ์ XAML ์์ฑ ๊ฐ์ '''์ค๊ดํธ {}'''๋ฅผ ์ฌ์ฉํ์ฌ ํน๋ณํ ๊ฐ์ ์ง์ ํ๋ ๊ตฌ๋ฌธ์ ๋๋ค. {์ }๋ก ๋๋ฌ์ธ์ธ ๊ฐ์ ๋จ์ ๋ฌธ์์ด์ด ์๋๋ผ XAML ์ปดํ์ผ๋ฌ์ ์ํด ํน๋ณํ ๊ฐ์ฒด ์์ฑ ๋ ผ๋ฆฌ๋ก ์ฒ๋ฆฌ๋ฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์๋ฅผ ๋ค์ด <Rectangle Fill="{x:Null}" .../>์์ {x:Null}์ null ๊ฐ์ ํํํ๋ ๋งํฌ์ ํ์ฅ์ผ๋ก ํด์๋์ด, Rectangle์ Fill ์์ฑ์ ์ค์ null(ํฌ๋ช )์ ๋ฃ๋ ์์ ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E6%A0%87%E8%AE%B0%E6%89%A9%E5%B1%95%E8%83%BD%E5%9C%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E6%A0%B9%E6%8D%AE%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BA%A7%E7%94%9F%E5%90%88%E9%80%82%E7%9A%84%E5%AF%B9%E8%B1%A1%EF%BC%8C%E4%BD%BFXAML%E4%BD%BF%E7%94%A8%E8%B5%B7%E6%9D%A5%E6%9B%B4%E5%8A%A0%E7%81%B5%E6%B4%BB%EF%BC%9B|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋งํฌ์ ํ์ฅ์ XAML์์ ์์ฃผ ์ฐ์ด๋ฉฐ, WPF์์ ์์ฃผ ์ฌ์ฉํ๋ ์ฃผ์ ๋งํฌ์ ํ์ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: * <code>{Binding ...}</code> โ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํํํฉ๋๋ค. ์๋ฅผ ๋ค์ด Text="{Binding Name}"์ฒ๋ผ ์ฐ๋ฉด DataContext๋ก๋ถํฐ Name ์์ฑ์ ์ค์๊ฐ์ผ๋ก ๊ฐ์ ธ์ Text์ ํ์ํ๋ Binding ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. * <code>{StaticResource ...}</code> โ ์ ์ ๋ฆฌ์์ค ์ฐธ์กฐ๋ฅผ ํํํฉ๋๋ค. ๋ฆฌ์์ค ๋์ ๋๋ฆฌ์ ์ ์๋ ์์์ ๋ก๋ ์์ ์ ํ ๋ฒ๋ง ์ฐพ์์ ์ ๊ณตํ๋ฉฐ, ์ฃผ๋ก ๋ธ๋ฌ์, ์คํ์ผ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ ๋ ์๋๋ค. * <code>{DynamicResource ...}</code> โ ๋์ ๋ฆฌ์์ค ์ฐธ์กฐ๋ฅผ ํํํฉ๋๋ค. ๋ฆฌ์์ค๋ฅผ ๋ฐํ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋๋ก ๋ฆ๊ฒ ๋ฐ์ธ๋ฉํ์ฌ, ์ดํ ๋ฆฌ์์ค ๊ฐ์ด ๋ฐ๋๋ฉด UI์ ์ฆ์ ๋ฐ์๋๊ฒ ํฉ๋๋ค. (์: ํ ๋ง ๋ณ๊ฒฝ ๋ฑ) * <code>{x:Static ...}</code> โ XAML์์ ์ ์ ํ๋๋ ์์ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด {x:Static SystemColors.ControlBrush}๋ ์ ์ ํ๋กํผํฐ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค. * <code>{x:Type ...}</code> โ ํ์ ์์ฒด๋ฅผ XAML์์ ์ฌ์ฉํด์ผ ํ ๋ ์๋๋ค. ์๋ฅผ ๋ค์ด <Control Template="{StaticResource MyTemplate}" TargetType="{x:Type Button}"> ๊ฐ์ ๊ฒฝ์ฐ์ ๋๋ค. ์ด ์ค StaticResource์ DynamicResource๋ WPF ๋ฆฌ์์ค ์์คํ ๊ณผ ๊ด๋ จ์ด ๊น์ต๋๋ค. Part 2์์๋ ๋ฆฌ์์ค ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์์ธํ ๋ค๋ฃจ๋๋ฐ, ์์ฝํ์๋ฉด '''๋ฆฌ์์ค(Resource)'''๋ ๋ธ๋ฌ์, ์คํ์ผ, ์ปจํธ๋กค ํ ํ๋ฆฟ ๋ฑ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํด ๋๊ณ ํ์ํ ๋ ์ฐธ์กฐํด์ ์ฐ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. WPF ๋ฆฌ์์ค๋ '''์์ ์ฌ์ (ResourceDictionary)'''์ ํค-๊ฐ ์์ผ๋ก ์ ์ฅ๋๋ฉฐ, XAML์ <Window.Resources>๋ <Application.Resources> ๋ธ๋ก, ํน์ ๊ฐ๋ณ ์ปจํธ๋กค์ Resources์ ์ ์ํ ์ ์์ต๋๋ค. ๋ฆฌ์์ค ์ ์ ์์น์ ๋ฐ๋ผ '''๋ฒ์(Scope)'''๊ฐ ๋ฌ๋ผ์ง๋๋ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ, ๊ฐ๋ณ Window/ํ์ด์ง, ํน์ ํจ๋ or ์ปจํธ๋กค ๋ฒ์ ๋ฑ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๋ฆฌ์์ค ์ฐพ๊ธฐ๋ XAML ๋ ผ๋ฆฌ ํธ๋ฆฌ(logical tree)๋ฅผ ๋ฐ๋ผ ์์ ์์ค์ผ๋ก ์ ํ๋๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์๋ฅผ ๋ค์ด ๋ฒํผ ๋ฐฐ๊ฒฝ์์ {StaticResource MyBrush}๋ก ์ง์ ํ๋ฉด, ๋ฒํผ ์์ ์ Resources์์ MyBrush ํค๋ฅผ ์ฐพ๊ณ ์์ผ๋ฉด ๋ถ๋ชจ ํจ๋, ์์ผ๋ฉด Window, ๊ทธ๋๋ ์์ผ๋ฉด Application ๋ฆฌ์์ค์์ ์ฐพ๋ ์์ ๋๋ค. StaticResource vs DynamicResource: StaticResource ๋งํฌ์ ํ์ฅ์ XAML์ด ๋ก๋๋ ๋ ํ ๋ฒ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ๋ฐ์ธ๋ฉํ๊ณ ์ดํ์๋ ๋ณํ์ง ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E5%9C%A8WPF%E7%BC%96%E7%A8%8B%E4%B8%AD%E5%BA%94%E7%94%A8%E6%9C%80%E5%B9%BF%E7%9A%84%E6%98%AF%E6%94%AF%E6%8C%81%E8%B5%84%E6%BA%90%E5%BC%95%E7%94%A8%E7%B1%BB%EF%BC%88StaticResource%2CDynamicResource%EF%BC%89%E5%92%8C%E6%94%AF%E6%8C%81%E6%95%B0%E6%8D%AE%E7%BB%91%E5%AE%9A%E7%B1%BB%EF%BC%88Binding%EF%BC%89%EF%BC%9B%E6%B3%A8%E6%84%8F%E5%90%8E%E9%9D%A2%E6%B2%A1%E6%9C%89%27Ext%20ension%27%E5%AD%97%E6%A0%B7%EF%BC%9B%E8%BF%99%E6%98%AF%E7%94%B1%E7%BC%96%E8%AF%91%E5%99%A8%E6%9A%97%E6%8C%87%E7%9A%84%EF%BC%8C%E5%A6%82%E5%90%8C|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E6%88%91%E4%BB%AC%E6%B3%A8%E6%84%8F%E5%88%B0%E6%88%91%E4%BB%AC%E5%9C%A8%E4%BD%BF%E7%94%A8%E8%AF%AD%E5%8F%A5StaticResourceExtension|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋ฐ๋ฉด DynamicResource๋ ๋ฐํ์์ ๋ฆฌ์์ค๋ฅผ ์กฐํํ๋ฉฐ, ๋ง์ฝ ํด๋น ๋ฆฌ์์ค๊ฐ ๋์ค์ ๋ณ๊ฒฝ๋๊ฑฐ๋ ํ ๋ง ๋ณ๊ฒฝ ๋ฑ์ ์ํด ์๋ก ์ ์๋๋ฉด ์๋์ผ๋ก UI์ ๊ฐฑ์ ์ ๋ฐ์ํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E6%88%91%E4%BB%AC%E6%B3%A8%E6%84%8F%E5%88%B0%E6%88%91%E4%BB%AC%E5%9C%A8%E4%BD%BF%E7%94%A8%E8%AF%AD%E5%8F%A5StaticResourceExtension|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋ฐ๋ผ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ์ฌ๋ถ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ์์ ์ ํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ํ ๋ง ์์์ ๋ฐ๊ฟ ์ ์๋ ์คํจ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด DynamicResource๋ก ๋ธ๋ฌ์๋ฅผ ์ฐธ์กฐํด์ผ UI๊ฐ ์ฆ์ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ฐ๋๋ก ๊ณ ์ ๋ ์์(์: ํญ์ ๋์ผํ ์์ด์ฝ ์ด๋ฏธ์ง)์ด๋ผ๋ฉด StaticResource๋ก ํ์ฌ ์ฑ๋ฅ๊ณผ ๊ฐ๊ฒฐํจ์ ์ทจํ๋ ๊ฒ์ด ์ข์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E5%9C%A8WPF%E7%BC%96%E7%A8%8B%E4%B8%AD%E5%BA%94%E7%94%A8%E6%9C%80%E5%B9%BF%E7%9A%84%E6%98%AF%E6%94%AF%E6%8C%81%E8%B5%84%E6%BA%90%E5%BC%95%E7%94%A8%E7%B1%BB%EF%BC%88StaticResource%2CDynamicResource%EF%BC%89%E5%92%8C%E6%94%AF%E6%8C%81%E6%95%B0%E6%8D%AE%E7%BB%91%E5%AE%9A%E7%B1%BB%EF%BC%88Binding%EF%BC%89%EF%BC%9B%E6%B3%A8%E6%84%8F%E5%90%8E%E9%9D%A2%E6%B2%A1%E6%9C%89%27Ext%20ension%27%E5%AD%97%E6%A0%B7%EF%BC%9B%E8%BF%99%E6%98%AF%E7%94%B1%E7%BC%96%E8%AF%91%E5%99%A8%E6%9A%97%E6%8C%87%E7%9A%84%EF%BC%8C%E5%A6%82%E5%90%8C|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E6%88%91%E4%BB%AC%E6%B3%A8%E6%84%8F%E5%88%B0%E6%88%91%E4%BB%AC%E5%9C%A8%E4%BD%BF%E7%94%A8%E8%AF%AD%E5%8F%A5StaticResourceExtension|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ๋ด๋ถ์ ์ผ๋ก XAML ์ปดํ์ผ๋ฌ๋ {StaticResource Key} ๊ตฌ๋ฌธ์ StaticResourceExtension ๊ฐ์ฒด๋ก ๋ณํํ๋๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์๋ ์ค๊ดํธ ๊ตฌ๋ฌธ๋ง ์ฐ๋ฉด ๋๊ณ Extension์ด๋ผ๋ ์ ๋ฏธ์ด๋ ๋ช ์ํ์ง ์์ต๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E5%9C%A8WPF%E7%BC%96%E7%A8%8B%E4%B8%AD%E5%BA%94%E7%94%A8%E6%9C%80%E5%B9%BF%E7%9A%84%E6%98%AF%E6%94%AF%E6%8C%81%E8%B5%84%E6%BA%90%E5%BC%95%E7%94%A8%E7%B1%BB%EF%BC%88StaticResource%2CDynamicResource%EF%BC%89%E5%92%8C%E6%94%AF%E6%8C%81%E6%95%B0%E6%8D%AE%E7%BB%91%E5%AE%9A%E7%B1%BB%EF%BC%88Binding%EF%BC%89%EF%BC%9B%E6%B3%A8%E6%84%8F%E5%90%8E%E9%9D%A2%E6%B2%A1%E6%9C%89%27Ext%20ension%27%E5%AD%97%E6%A0%B7%EF%BC%9B%E8%BF%99%E6%98%AF%E7%94%B1%E7%BC%96%E8%AF%91%E5%99%A8%E6%9A%97%E6%8C%87%E7%9A%84%EF%BC%8C%E5%A6%82%E5%90%8C|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. Part 2 ๊ธ์์๋ ๋ฆฌ์์ค์ ๊ณ์ธต ๋ฒ์์ ๋ํ ์์๋ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, <Application.Resources>์ ์ ์๋ ๋ธ๋ฌ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ ๋ฆฌ์์ค๋ก์ ์ด๋์์๋ {StaticResource}๋ก ์ธ ์ ์๊ณ , <Window.Resources>์ ์ ์๋ ๊ฒ์ ๊ทธ ์ฐฝ ๋ด๋ถ์์๋ง ์ ํจํฉ๋๋ค. ๋ํ ๋ณ๋์ .xaml ๋ฆฌ์์ค ์ฌ์ ํ์ผ์ ๋ง๋ค์ด ์ฌ๋ฌ ๊ณณ์์ ๋ณํฉ(Merged Dictionaries)ํ์ฌ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ค์ ์ฝ๋ ์์์์๋ ์ฑ ์์ค(appLevelResourceGreenBrush), ์๋์ฐ ์์ค(windowLevelResourceBlueBrush), ๋ถ๋ชจ ํจ๋ ์์ค(parentLevelResourceOrangeBrush), ์ธ๋ถ ๋ฆฌ์์ค ํ์ผ(seperateResourceFilePinkBrush)์ ๋ธ๋ฌ์๋ฅผ ์ ์ํ๊ณ ๊ฐ๊ฐ StaticResource๋ก ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋๋ฐ, WPF ๋ฆฌ์์ค ์์คํ ์ด ๊ฐ๊น์ด ๋ฒ์์ ๋ฆฌ์์ค๋ฅผ ์ฐ์ ์ฐพ๋๋ค๋ ๊ฒ์ ๊ฐ์กฐํฉ๋๋คblog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=%E4%B9%9F%E5%B0%B1%E6%98%AF%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E5%92%8C%E5%8A%A8%E6%80%81%E8%B5%84%E6%BA%90%EF%BC%8C%E5%88%86%E5%88%AB%E7%94%A8StaticResourceExtension%E5%92%8CDynamicResourceExtension%E6%9D%A5%E8%A1%A8%E7%A4%BA%EF%BC%9B|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>blog.csdn.net<ref>{{cite web|title=blog.csdn.net|url=https://blog.csdn.net/huan_126/article/details/80447233#:~:text=Background%3D|publisher=blog.csdn.net|access-date=2025-12-02}}</ref>. ์ ๋ฆฌํ๋ฉด, Part 2์์๋ WPF์ ๋ถ๋ฆฌ๋ ์ฝ๋/๋์์ธ ํจํด๊ณผ '''XAML ์ธ์ด์ ์ฃผ์ ์์๋ค(ํด๋์ค ์ฐธ์กฐ, ๋งํฌ์ ํ์ฅ, ๋ฆฌ์์ค)'''์ ์์ธํ ์ค๋ช ํ๊ณ ์์ต๋๋ค. ์ด ๋๋ถ์ ๋ ์๋ XAML๋ก ๋ฌด์์ ์ ์ธํ๊ณ , ์ฝ๋์์ ๋ฌด์์ ๊ตฌํํด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ํจ์จ์ ์ธ UI ์ฌ์ฌ์ฉ์ ์ํด ๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์ดํดํ๊ฒ ๋ฉ๋๋คstackoverflow.com<ref>{{cite web|title=stackoverflow.com|url=https://stackoverflow.com/questions/29700/can-someone-point-me-to-some-guides-for-wpf#:~:text=Can%20someone%20point%20me%20to,introduction%20into%20WPF%20Dependancy|publisher=stackoverflow.com|access-date=2025-12-02}}</ref>stackoverflow.com<ref>{{cite web|title=stackoverflow.com|url=https://stackoverflow.com/questions/29700/can-someone-point-me-to-some-guides-for-wpf#:~:text=RoutedEvents%20%2F%20RoutedCommands%20%C2%B7%20An,introduction%20into%20WPF%20Dependancy|publisher=stackoverflow.com|access-date=2025-12-02}}</ref>. ==== Part 3: ๋ผ์ฐํธ ์ด๋ฒคํธ์ ๋ช ๋ น (Routed Events & Commands) ==== Part 3์์๋ WPF์ '''๋ผ์ฐํธ ์ด๋ฒคํธ(Routed Events)'''์ ์ปค๋งจ๋(Commands) ์์คํ ์ ์๊ฐํฉ๋๋คstackoverflow.com<ref>{{cite web|title=stackoverflow.com|url=https://stackoverflow.com/questions/29700/can-someone-point-me-to-some-guides-for-wpf#:~:text=,into%20WPF%20Styles%20And%20Templates|publisher=stackoverflow.com|access-date=2025-12-02}}</ref>. ์ด ๋ ๊ฐ์ง๋ ์ ํต์ ์ธ WinForms์๋ ์๋ WPF ๊ณ ์ ์ ๊ฐ๋ ์ผ๋ก, ๋ณด๋ค ํ๋ ฅ์ ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ UI ์ก์ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ===== ๋ผ์ฐํธ ์ด๋ฒคํธ (Routed Events) ===== ์ผ๋ฐ์ ์ธ .NET ์ด๋ฒคํธ์ ๋ฌ๋ฆฌ, ๋ผ์ฐํธ ์ด๋ฒคํธ๋ UI ์์ ๊ณ์ธต์ ๋ฐ๋ผ '''์ ๋ฌ(์ ํ, route)'''๋๋ ์ด๋ฒคํธ์ ๋๋ค. WPF์ ์๊ฐ์ /๋ ผ๋ฆฌ์ ํธ๋ฆฌ ๊ตฌ์กฐ ์์์ ํ ์์๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฉด, ๊ทธ ์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ ์์๋ค๋ก ์ ๋ฌ๋์ด ์ฌ๋ผ๊ฐ๊ฑฐ๋ (๋ฒ๋ธ๋ง, Bubbling), ๋ฐ๋๋ก ๋ถ๋ชจ์์ ์์ ๋ฐฉํฅ์ผ๋ก ์ ๋ฌ๋๊ฑฐ๋ (ํฐ๋๋ง, Tunneling) ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฒํผ์ ํด๋ฆญํ๋ฉด Button ํด๋์ค์ Click ์ด๋ฒคํธ๊ฐ ๋จผ์ ๋ฒํผ ์์ ์ ๋ฐ์ํ ํ, ๋ฒ๋ธ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ ์ด ์ด๋ฒคํธ๊ฐ ์์ ์ปจํ ์ด๋๋ก Bubble Up ๋์ด Button์ ๋ถ๋ชจ StackPanel์ด๋ ๊ทธ ๋ถ๋ชจ Window๊น์ง ์์ฐจ์ ์ผ๋ก ์ ๋ฌ๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ถ๋ชจ ์ปจํ ์ด๋์์ ํ์ ์์๋ค์ ์ด๋ฒคํธ๋ฅผ ํ ๊ณณ์์ ์ฒ๋ฆฌํ ์๋ ์์ต๋๋ค. ๋ฐ๋๋ก ํฐ๋ ์ด๋ฒคํธ๋ PreviewMouseDown์ฒ๋ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ(Preview) ์ ๋์ฌ๊ฐ ๋ถ์ ์ด๋ฒคํธ๋ก, ์ต์์(Window)์์ ์์ํด ์์ ์์ ๋ฐฉํฅ์ผ๋ก ๋ด๋ ค์ค๋ฉด์ ์ ๋ฌ๋ฉ๋๋ค. WPF์์๋ ์ผ๋ฐ์ ์ผ๋ก ํฐ๋๋ง ์ด๋ฒคํธ ์ด๋ฆ์ด Preview...๋ก ์์ํ๊ณ , ๋ฒ๋ธ๋ง ์ด๋ฒคํธ๋ ...๋ก ๋๋ฉ๋๋ค (์: PreviewKeyDown ํฐ๋๋ง -> KeyDown ๋ฒ๋ธ๋ง). ๋ผ์ฐํธ ์ด๋ฒคํธ์ ์ด์ ์ ๋ค์์ UI ์์๋ฅผ ํฌํจํ๋ ๋ณต์กํ ์ปจํธ๋กค ๊ตฌ์กฐ์์ ์ด๋ฒคํธ ํธ๋ค๋ง์ ๊ตฌ์กฐํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ด๋ถ์ ์ฌ๋ฌ ๋ฒํผ์ด ์๋ ์ฌ์ฉ์ ์ปจํธ๋กค์์, ๊ฐ๋ณ ๋ฒํผ ํด๋ฆญ์ ๋ชจ๋ ๋ถ๋ชจ ์ฐฝ์ผ๋ก ๋ฒ๋ธ๋ง์์ผ ๋ถ๋ชจ ์ฐฝ ์ฝ๋์์ ์ผ๊ด ์ฒ๋ฆฌํ๊ฒ ํ ์ ์์ต๋๋ค. ๋๋ ํ์ ์์์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ํ์(e.Handled = true)ํ๋ฉด ๋ ์ด์ ์์๋ก ์ ํ๋์ง ์๊ฒ ํ์ฌ ํน์ ๊ณ์ธต๊น์ง๋ง ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ง๋ค ์๋ ์์ต๋๋ค. WPF์์๋ ์ปค์คํ ๋ผ์ฐํธ ์ด๋ฒคํธ๋ ์ ์ํ ์ ์์ต๋๋ค. ์๋ก์ด ์ด๋ฒคํธ๋ฅผ ๋ง๋ค ๋ RoutedEvent๋ฅผ ๋ฑ๋กํ๊ณ (EventManager.RegisterRoutedEvent), ํด๋น ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ๋๋ RaiseEvent(new RoutedEventArgs(...)) ์์ผ๋ก ํธ์ถํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ณธ ์ ๊ณต ์ด๋ฒคํธ๋ฟ ์๋๋ผ ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ๋ ๋์ผํ ๋ผ์ฐํ ๋ฉ์ปค๋์ฆ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. (์๋ฅผ ๋ค์ด '''์ฒจ๋ถ ์ด๋ฒคํธ(Attached Event)'''๋ ๋ผ์ฐํธ ์ด๋ฒคํธ์ ํ ์ข ๋ฅ๋ก, XAML์์ <StackPanel MouseLeftButtonDown="...">์ฒ๋ผ ์์ ์์์ ์ด๋ฒคํธ๋ฅผ ๋ถ๋ชจ XAML์์ directly ๋ค๋ฃฐ ์๋ ์๋๋ฐ, ์ด ๋ํ ๋ผ์ฐํธ ์ด๋ฒคํธ๋ก ๊ตฌํ๋ฉ๋๋ค.) ===== ์ปค๋งจ๋ (Commands) ===== '''๋ช ๋ น(Command)'''์ WPF์์ ๋ฒํผ ํด๋ฆญ ๋ฑ ์ฌ์ฉ์ ๋์์ ์ถ์ํํ ์ก์ ๊ฐ์ฒด์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ๋ฌ๋ฆฌ, ์ปค๋งจ๋๋ UI ์์์ ์คํ ๋ก์ง์ ๋์จํ๊ฒ ์ฐ๊ฒฐํด์ฃผ๋ ์ค์์ง์ค์ ํ๋ ํจํด์ด๋ผ๊ณ ํ ์ ์์ต๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/Extending-WPF-Commands#:~:text=For%20an%20introduction%20to%20WPF,CommandBinding%20s%20and|publisher=codeproject.com|access-date=2025-12-02}}</ref>. WPF์๋ ์๋ฅผ ๋ค์ด ์๋ผ๋ด๊ธฐ, ๋ณต์ฌ, ๋ถ์ฌ๋ฃ๊ธฐ ๋ฑ์ ๋ํ๋ด๋ ApplicationCommands.Cut, Copy, Paste์ ๊ฐ์ ํ์ค ์ปค๋งจ๋๋ค์ด ๋ฏธ๋ฆฌ ์ ์๋์ด ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ด๋ฌํ ์ปค๋งจ๋๋ฅผ ๋ฒํผ์ด๋ ๋ฉ๋ด ํญ๋ชฉ์ ๋ฐ์ธ๋ฉํ๊ณ , ํด๋น ์ปค๋งจ๋๊ฐ ์คํ๋์ ๋ ํธ์ถ๋ ๋ก์ง์ ์ปค๋งจ๋ ๋ฐ์ธ๋ฉ์ผ๋ก ์ฐ๊ฒฐํ๋ฉด, UI์ ๋ก์ง์ด ๋ถ๋ฆฌ๋ ์ฑ๋ก ๋์์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ปค๋งจ๋์ ํต์ฌ์ ICommand ์ธํฐํ์ด์ค๋ก, Execute(object parameter)์ CanExecute(object parameter) ๋ฉ์๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. WPF์์๋ RoutedCommand๋ผ๋ ๊ตฌํ์ ์ฃผ๋ก ์ฐ๋๋ฐ, ์ด๋ ๋ผ์ฐํธ ์ด๋ฒคํธ์ฒ๋ผ ์ปค๋งจ๋ ์คํ ์๊ตฌ๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ ์ ๋ฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ค ๋ฒํผ์ Command ์์ฑ์ SaveCommand๋ฅผ ์ง์ ํ๊ณ ํด๋ฆญํ๋ฉด, WPF๋ ํด๋น ๋ฒํผ์ด ์ํ ์๋์ฐ๋ ๋ถ๋ชจ ์์๋ค์์ ์ด ์ปค๋งจ๋๋ฅผ ์ฒ๋ฆฌํ ๊ณณ์ ์ฐพ์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ํด๋น UI ํธ๋ฆฌ์์ CommandManager๋ CommandBinding์ ํ์ํฉ๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/Extending-WPF-Commands#:~:text=For%20an%20introduction%20to%20WPF,CommandBinding%20s%20and|publisher=codeproject.com|access-date=2025-12-02}}</ref>. CommandBinding์ ํน์ ์ปค๋งจ๋์ ๋ํด CanExecute ๋ฐ Executed ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐ๊ฒฐํด๋์ ๋ฐ์ธ๋ฉ ๊ฐ์ฒด์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Window๋ UserControl ์์ค์์ <Window.CommandBindings> ์ปฌ๋ ์ ์ CommandBinding Command="SaveCommand" Executed="Save_Executed" CanExecute="Save_CanExecute"/> ์์ผ๋ก ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ฅผ ๋ ๋ฒํผ -> Window๋ก ์ปค๋งจ๋ ์์ฒญ์ด ์ ๋ฌ๋๊ณ , Window์ ์ ์๋ CommandBinding์ด ์ด๋ฅผ ๋ฐ์ CanExecute ์ด๋ฒคํธ๋ฅผ ๋จผ์ ํธ์ถํฉ๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/WPF-A-Beginner-s-guide-Part-3-of-n#:~:text=WPF%3A%20A%20Beginner%27s%20guide%3A%20Part,and%20what%20to%20do|publisher=codeproject.com|access-date=2025-12-02}}</ref>. ์ด ํธ๋ค๋ฌ์์ ํ์ฌ ์ํฉ์ Save ์ํ์ด ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ e.CanExecute์ ์ค์ ํ๋ฉด, WPF๊ฐ ๊ทธ ๊ฐ์ ๋ณด๊ณ ๋ฒํผ์ ํ์ฑ/๋นํ์ฑ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋๋ค (CanExecute๊ฐ false๋ฉด ๋ฒํผ์ด ์๋์ผ๋ก ๋นํ์ฑํ๋จ). ๊ทธ๋ฆฌ๊ณ CanExecute๊ฐ true์ผ ๊ฒฝ์ฐ, ์ด์ด์ Executed ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ถ๋ ค ์ค์ ์ ์ฅ ๋์์ ์ํํ๋ฉด ๋ฉ๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/Extending-WPF-Commands#:~:text=For%20an%20introduction%20to%20WPF,CommandBinding%20s%20and|publisher=codeproject.com|access-date=2025-12-02}}</ref>. ์ด๋ฌํ ์ปค๋งจ๋ ํจํด์ ์ฌ๋ฌ ์ปจํธ๋กค์์ ๋์ผํ ์ปค๋งจ๋๋ฅผ ๊ณต์ ํ๊ฒ ํด์ฃผ๋ฏ๋ก ์ผ๊ด์ฑ ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ค๊ณ๋ฅผ ๋์ต๋๋ค. ์๋ฅผ ๋ค์ด ํค๋ณด๋ ๋จ์ถํค์ ํด๋ฐ ๋ฒํผ๊ณผ ๋ฉ๋ด ํญ๋ชฉ์ด ๋ชจ๋ ๊ฐ์ CopyCommand๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค๋ฉด, ํ๋์ Executed ํธ๋ค๋ฌ๋ง์ผ๋ก ๋ชจ๋ ๊ฒฝ๋ก์์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ ์ด๋ ์ปจํธ๋กค์ด ํฌ์ปค์ค๋ฅผ ๋ฐ์๋๋์ ๋ฐ๋ผ ํน์ ์ปค๋งจ๋์ CanExecute๋ฅผ ๋ค๋ฅด๊ฒ ํ๋จํ์ฌ UI๋ฅผ ์ปจํธ๋กคํ ์๋ ์์ต๋๋ค. (์ด์์ ์ธ ๊ฒฝ์ฐ, ์ปค๋งจ๋ ๋ก์ง์ ViewModel์ ๋๊ณ , View๋ CommandBinding ๋์ MVVM์ ICommand ๊ตฌํ์ฒด์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ ๊น๋ํ๊ฒ ๊ตฌํํ์ง๋ง, Part 3์์๋ ์ฃผ๋ก Code-behind์์ CommandBinding ์ฌ์ฉํ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ณ ์์ต๋๋ค.) ์ ๋ฆฌํ๋ฉด, Part 3์์๋ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ์ํค๋ ๊ณ ๊ธ ๊ธฐ๋ฒ์ธ ๋ผ์ฐํธ ์ด๋ฒคํธ์ UI ๋์์ ์ถ์ํํ์ฌ ๋ช ๋ น ํจํด์ผ๋ก ๋ค๋ฃจ๋ WPF ์ปค๋งจ๋๋ฅผ ์๊ฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ ์ ์ ์ฝ๋๋ก๋ ๋ณต์กํ UI ์ด๋ฒคํธ ํ๋ฆ์ ๊ด๋ฆฌํ ์ ์๊ณ , View์ Logic์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค. ์์ปจ๋, Part 3์ ์์ ์์๋ ์ฌ์ฉ์๊ฐ ์ง์ Custom RoutedEvent์ RoutedCommand๋ฅผ ์ ์ํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ๊น์ง ๋ค๋ฃจ๋ฉฐ, ์ด๋ฅผ ํตํด WPF์ ์ด๋ฒคํธ/์ปค๋งจ๋ ์์คํ ์ด ์ผ๋ง๋ ๊ฐ๋ ฅํ์ง ๋ณด์ฌ์ค๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/A-Coder-Interview-With-Sacha-Barber#:~:text=My%20name%20is%20Sacha%20Barber,Custom%20Routed%20Commands%2C%20ICommand|publisher=codeproject.com|access-date=2025-12-02}}</ref>. ==== Part 4: ์ข ์์ฑ ์์ฑ (Dependency Properties) ==== Part 4์์๋ WPF ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ์ธํ๋ผ ์ค ํ๋์ธ '''์ข ์์ฑ ์์ฑ(Dependency Property)'''์ ๋ํด ์ค๋ช ํฉ๋๋คstackoverflow.com<ref>{{cite web|title=stackoverflow.com|url=https://stackoverflow.com/questions/29700/can-someone-point-me-to-some-guides-for-wpf#:~:text=,into%20WPF%20Styles%20And%20Templates|publisher=stackoverflow.com|access-date=2025-12-02}}</ref>. ์ข ์์ฑ ์์ฑ(์ดํ DP)์ WPF์ ์์ฑ(Property) ์์คํ ์ ๊ตฌ์ฑํ๋ ํน๋ณํ ํํ์ ์์ฑ์ผ๋ก, ๋จ์ํ CLR ์์ฑ๊ณผ ๋๋น๋ฉ๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-4-of-n#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%20,Dependency%20Properties%3B%20Dependency|publisher=codeproject.com|access-date=2025-12-02}}</ref>. WPF์ ๋ง์ ์ปจํธ๋กค ์์ฑ๋ค(์: Button.Background, TextBox.Text ๋ฑ)์ด ๋ชจ๋ DP๋ก ๊ตฌํ๋์ด ์์ต๋๋ค. ์ด๋ฌํ DP๋ WPF์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ, ์คํ์ผ, ์ ๋๋ฉ์ด์ , ๊ฐ ์์ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ฐ๋ฅ์ผ ํ๋ ๊ธฐ๋ฐ์ ๋๋ค. CLR ์์ฑ๊ณผ DP์ ์ฐจ์ด์ : ์ผ๋ฐ์ ์ธ C# ํด๋์ค ์์ฑ์ ํ๋์ ๊ฐ์ ์ ์ฅํ๊ณ get/set ์ ๊ทผ์๋ฅผ ํตํด ์ฝ๊ณ ์๋๋ค. ๋ฐ๋ฉด WPF์ DP๋ ๋ด๋ถ์ ์ผ๋ก ์ ์ญ ํด์ ํ ์ด๋ธ์ ์์ฑ ๊ฐ๋ค์ ์ ์ฅํ๊ณ , ์์กด์ฑ ๊ฐ์ฒด(DependencyObject)์ GetValue/SetValue ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ์ฝ๊ณ ์ฐ๋ ๊ตฌ์กฐ์ ๋๋ค. DP๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์์ต๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-4-of-n#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%20,Dependency%20Properties%3B%20Dependency|publisher=codeproject.com|access-date=2025-12-02}}</ref>: * ๋ณ๊ฒฝ ํต์ง ๋ด์ฅ: DP๋ ๊ฐ ๋ณ๊ฒฝ ์ WPF ์์ฒด์ ์๋ฆผ์ ์ฃผ์ด, ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋ UI ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. (์ผ๋ฐ CLR ์์ฑ์ INotifyPropertyChanged ๊ตฌํ ๋ฑ์ ์๋์ผ๋ก ํด์ผ ํ์ง๋ง, DP๋ ์ด๋ฐ ํจํด์ ์์ฑ ์์คํ ์ ๋ด์ฅํ๊ณ ์์ต๋๋ค.) * ์์ฑ ๊ฐ์ ๋์ ๊ฒฐ์ : DP ์์คํ ์ ์ฐ์ ์์๊ฐ ๋ค๋ฅธ ์ฌ๋ฌ ์์ค(๋ก์ปฌ ๊ฐ, ๋ฐ์ธ๋ฉ, ์คํ์ผ, ํ ๋ง, ์ ๋๋ฉ์ด์ ๋ฑ)๋ก๋ถํฐ ์ค๋ ๊ฐ๋ค์ ์กฐํฉํ์ฌ ์ต์ข ๊ฐ์ ๊ฒฐ์ ํฉ๋๋ค. WPF ์์ง์ด ์ด๋ฌํ ์ฐ์ ์์ ๋ก์ง์ ๊ด๋ฆฌํด์ฃผ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ์ฒ๋ฆฌํ์ง ์์๋ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์คํ์ผ์์ Button์ ๋ฐฐ๊ฒฝ์ ๋นจ๊ฐ์ผ๋ก ์ ํ์ด๋, ์ ๋๋ฉ์ด์ ์ด ์งํ์ค์ด๋ฉด ์ ๋๋ฉ์ด์ ๊ฐ์ด ์ฐ์ ์ ์ฉ๋๋ ์์ ๋๋ค. * ๊ธฐ๋ณธ๊ฐ(Default)๊ณผ ์์(Inheritance): DP๋ฅผ ์ ์ํ ๋ ๋ฉํ๋ฐ์ดํฐ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ํ ์์ฑ ๊ฐ ์์์ด๋ผ๋ ๊ธฐ๋ฅ์ ํตํด, ํธ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ์์ ๋ถ๋ชจ ์์์ ์ค์ ๋ DP ๊ฐ์ด ํน๋ณํ ์์์์ ๊ฐ์ ์ง์ ํ์ง ์์ผ๋ฉด ์๋ ์์๋๋๋ก ํ ์ ์์ต๋๋ค. (์: FontSize๋ฅผ Window์ ์ค์ ํ๋ฉด ๋ด๋ถ ๋ชจ๋ ํ ์คํธ ์ปจํธ๋กค๋ค์ด ๊ทธ ๊ฐ์ ์์๋ฐ์ ๋์ผํ ๊ธ๊ผด ํฌ๊ธฐ๋ฅผ ๊ฐ์ต๋๋ค.) * Attached Property ์ง์: DP๋ '''์ฒจ๋ถ ์์ฑ(Attached Property)'''์ ํํ๋ก ์ ์๋์ด, ์์ ์ด ์๋ ๋ค๋ฅธ ํด๋์ค์ ์์ฑ์ XAML์์ ์ค์ ํ ์ ์๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด DockPanel.Dock ์์ฑ์ DockPanel์ด ์ ์ํ DP์ด์ง๋ง, XAML์์๋ <Button DockPanel.Dock="Top">์ฒ๋ผ Button ํ๊ทธ์ ๋ถ์ฌ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ DP ๋ฉ์ปค๋์ฆ ๋๋ถ์ Canvas.Left, DockPanel.Dock ๊ฐ์ ๋ ์ด์์ ํํธ ์์ฑ์ ์์์ ์์ ์์์ ๋ถ์ฌํ ์ ์์ต๋๋ค (Part 1์์ ๋ณธ Canvas์ DockPanel์ ์ฒจ๋ถ ์์ฑ๋ค์ด ๋ฐ๋ก ๊ทธ๊ฒ์ ๋๋ค). * ์ฑ๋ฅ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํจ์จ: ์๋ฐฑ ๊ฐ์ ์ปจํธ๋กค์ด ์์ ๋, DP ์์คํ ์ ์ค์ ๋ก ๊ฐ์ด ๋ฐ๋ ์์ฑ๋ง ์ ์ฅํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ๊ณต์ ํด์ ์ฌ์ฉํฉ๋๋ค. CLR ์์ฑ์ด๋ผ๋ฉด ๊ฐ ์ธ์คํด์ค๊ฐ ๊ฐ ํ๋๋ฅผ ๋ฐ๋ก ๊ฐ์ง๊ณ ์์ด์ผ ํ์ง๋ง, DP๋ ํ์์์๋ง ๊ฐ์ ์ ์ฅํ๋ ํฌ์ ์ ์ฅ(sparse storage) ์ต์ ํ๋ฅผ ํฉ๋๋ค. DP๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณดํต ์์กด์ฑ ์์ฑ ์๋ณ์๋ฅผ static ํ๋๋ก ์ ์ธํ๊ณ DependencyProperty.Register ๋ฉ์๋๋ก ๋ฑ๋กํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ์ ์ ์ปจํธ๋กค์ public string Title { get; set; } ๊ฐ์ CLR ์์ฑ์ ์ฐ๋ ๋์ , ๋ค์๊ณผ ๊ฐ์ด DP๋ฅผ ์ ์ธํฉ๋๋ค: <syntaxhighlight lang="csharp">public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(MyControl), new PropertyMetadata("๊ธฐ๋ณธ๊ฐ", OnTitleChanged)); public string Title { get => (string)GetValue(TitleProperty); set => SetValue(TitleProperty, value); } </syntaxhighlight> ์ ์ฝ๋์์ "Title" ์ด๋ฆ์ผ๋ก DP๋ฅผ ๋ฑ๋กํ๊ณ , ํ์๊ณผ ์์ ์ ํ์ ์ ์ง์ ํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ "๊ธฐ๋ณธ๊ฐ"์ผ๋ก ์ค์ ํ์ต๋๋ค. ๋ํ OnTitleChanged ์ฝ๋ฐฑ์ ๋ฃ์ผ๋ฉด ์ด ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋ ์๋์ผ๋ก ํธ์ถ๋์ด ์ถ๊ฐ ๋ก์ง์ ์ํํ ์ ์์ต๋๋ค. (์: Title์ด ๋ฐ๋๋ฉด ํ๋ฉด์ ์ฆ์ ๋ฐ์ํ๊ฑฐ๋, ๋ค๋ฅธ ์์ฑ์ ๊ฐฑ์ ํ๋ ๋ฑ์ ์์ ์ ํ ์ ์์ต๋๋ค.) ์ด๋ ๋ฏ DP๋ '''์์ฑ ๋ฑ๋ก ์์ ์ ๋ถ๊ฐ์ ๋ณด(Metadata)'''๋ฅผ ์ง์ ํ ์ ์์ด, ๋จ์ํ CLR ์์ฑ๋ณด๋ค ํจ์ฌ ํ๋ถํ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค. Part 4์์๋ CLR ์์ฑ๊ณผ DP์ ์ฐจ์ด๋ฅผ ๋จผ์ ์ง๊ณ codeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-4-of-n#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%20,Dependency%20Properties%3B%20Dependency|publisher=codeproject.com|access-date=2025-12-02}}</ref>, DP์ ๊ฐ๋ ๊ณผ ์ฌ์ฉํ๋ ๋ฒ, ๊ทธ๋ฆฌ๊ณ WPF ํ๋ ์์ํฌ ์์ฒด์์ DP๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์ค๋ช ํฉ๋๋ค. ํนํ WPF ๋ฐ์ธ๋ฉ๊ณผ ์คํ์ผ์ด DP๋ฅผ ์ ์ ๋ก ๋์ํ๋ค๋ ์ ์ ๊ฐ์กฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด TextBox.Text๋ Slider.Value๋ DP๋ก ๊ตฌํ๋์ด ์์ด์, Binding์ผ๋ก ์ฐ๊ฒฐํ๋ฉด ์์ค ๊ฐ์ฒด์ ๋ณํ๊ฐ UI์ ์๋ ๋ฐ์๋๊ณ , ๋ฐ๋๋ก UI์์ ์ฌ์ฉ์๊ฐ ์์ ํ ๊ฐ๋ DP ์์คํ ์ ํตํด ์์ค์ ์ ๋ฌ๋ฉ๋๋ค. ๋ง์ฝ TextBox.Text๊ฐ ๋จ์ CLR ์์ฑ์ด์๋ค๋ฉด, ์ด๋ฐ ์๋ ์ฐ๋์ ์ํด ๋งค๋ฒ ์ด๋ฒคํธ๋ฅผ ๋ฃ๊ณ ์๋์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ ์์ ์ด ํ์ํ์ ๊ฒ์ ๋๋ค. ๋ํ Part 4์์๋ '''์ฒจ๋ถ๋ ์ข ์์ฑ ์์ฑ (Attached DP)'''๋ ํจ๊ป ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ๋ํ์ ์ธ ์์๋ก ๋ ์ด์์ ๊ด๋ จ ์์ฑ๋ค(Canvas.Left ๋ฑ)์ ๋ค๋ฉฐ, ์ด๋ฌํ ์์ฑ์ด ์ฌ์ค์ DP๋ก ๊ตฌํ๋์ด ์์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ค๋ช ํฉ๋๋ค. ์ฒจ๋ถ DP๋ฅผ ๋ง๋ค ๋๋ DependencyProperty.RegisterAttached๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ฃผ๋ก XAML ์์์ ๋ถ๋ชจ-์์ ๊ฐ ๊ด๊ณ๋ฅผ ํ์ํ๊ฑฐ๋, Behavior๋ฅผ ๋ถ์ฌํ๋ ์๋๋ฆฌ์ค ๋ฑ์ ์ฐ์ ๋๋ค. ๋ง์ง๋ง์ผ๋ก, WPF ๊ฐ๋ฐ์์ ์ปค์คํ ์ปจํธ๋กค์ ๋ง๋ค ๊ฒฝ์ฐ ์ข ์์ฑ ์์ฑ์ ๊ผญ ํ์ฉํด์ผ ํ๋ ์ด์ ๋ ์๋ดํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์ปจํธ๋กค์ ์์ฑ์ DP๋ก ๋ง๋ค๋ฉด, WPF ๋์์ด๋(Blend) ์์์ ํด๋น ์์ฑ์ ์ฝ๊ฒ ๋ฐ์ธ๋ฉํ๊ฑฐ๋ ์ ๋๋ฉ์ด์ ์ค ์ ์๊ณ , ์คํ ๋ฆฌ๋ณด๋๋ ์คํ์ผ์์๋ ํ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋๋ก CLR ์์ฑ๋ง ์์ผ๋ฉด ์ด๋ฐ WPF์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ๊ธฐ ์ด๋ ค์์ง๋๋ค. Sacha Barber๋ ์ด๋ณด์๋ฅผ ์ํด ๋น๊ต์ ์ด๋ ค์ด ๊ฐ๋ ์ธ DP๋ฅผ ์์ธํ๊ณ ๋ ์ฒด๊ณ์ ์ผ๋ก ํ์ด์ฃผ๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ ์๋ WPF ์์ฑ ์์คํ ์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. ==== Part 5: ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ (Data Binding) ==== Part 5์์๋ WPF์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๋ํด ์ง์ค์ ์ผ๋ก ๋ค๋ฃน๋๋คcnitblog.com<ref>{{cite web|title=cnitblog.com|url=http://www.cnitblog.com/seeyeah/archive/2008/12/06/52275.html#:~:text=An%20introduction%20into%20WPF%20Dependancy,WPF%3A%20A%20Beginner%27s%20Guide|publisher=cnitblog.com|date=2008-12-06|access-date=2025-12-02}}</ref>. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ WPF์ ๊ฝ์ด๋ผ๊ณ ๋ถ๋ฆด ๋งํผ ์ค์ํ ๊ธฐ๋ฅ์ผ๋ก, UI์ ๋ฐ์ดํฐ ์์ค ๊ฐ์ ์ฐ๊ฒฐ์ ์ ์ธ์ ์ผ๋ก ์ค์ ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด ์ฅ์์๋ WPF ๋ฐ์ธ๋ฉ์ ์๋ฆฌ, ๊ตฌํ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ธ๋ฉ์ ํ์ํ ๋ณด์กฐ ๊ฐ๋ ๋ค(์: ๋ฐ์ดํฐ ์ปจํ ์คํธ, ๋ณ๊ฒฝ ํต์ง ๋ฑ)์ ์์ธํ ์ค๋ช ํฉ๋๋ค. WPF์์ ๋ฐ์ธ๋ฉ์ ์ค์ ํ๋ ค๋ฉด ๋ณดํต XAML์์ {Binding} ๋งํฌ์ ํ์ฅ์ ์ฌ์ฉํฉ๋๋ค. Binding์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ชฉํ(ํ๊ฒ) UI ์์ฑ๊ณผ ์์ค ๊ฐ์ฒด์ ๋ฐ์ดํฐ ์์ฑ์ ์ฐ๊ฒฐํ์ฌ ๋๊ธฐํํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด TextBox์ Text ์์ฑ์ Person ๊ฐ์ฒด์ Name ์์ฑ๊ณผ ๋ฐ์ธ๋ฉํ๋ฉด, ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ TextBox์ Person.Name ๊ฐ์ด ํ์๋๊ณ , ์ดํ ์ฌ์ฉ์ ์ ๋ ฅ์ผ๋ก Text๊ฐ ๋ฐ๋๋ฉด Person.Name์ ๋ฐ์๋๊ฑฐ๋ ๊ทธ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก๋ ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋ฉ๋๋ค. ์ด๋ฌํ ์ค์๊ฐ ๋๊ธฐํ๋ ๋ชจ๋ WPF์ ๋ฐ์ธ๋ฉ ์์ง์ด ์ฒ๋ฆฌํด์ค๋๋ค. DataContext (๋ฐ์ดํฐ ์ปจํ ์คํธ): WPF ๋ฐ์ธ๋ฉ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋ ์ด DataContext์ ๋๋ค. DataContext๋ ๋ฐ์ธ๋ฉ ์์ค์ ๊ธฐ๋ณธ ์ฐธ์กฐ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์์ปจ๋ฐ <Window DataContext="{Binding Source={StaticResource SomePerson}}" ...>๋ก ์๋์ฐ์ DataContext๋ฅผ Person ๊ฐ์ฒด๋ก ์ง์ ํ๋ฉด, ๊ทธ ์ฐฝ ๋ด๋ถ์ ๋ชจ๋ ๋ฐ์ธ๋ฉ์ ๋ณ๋ ์์ค ์ง์ ์ด ์๋ ํ ์ด Person์ ๊ธฐ์ค์ผ๋ก ๋์ํฉ๋๋ค. XAML์์ {Binding Name}์ด๋ผ๊ณ ๋ง ํด๋ ์ฌ์ค์ DataContext.Name์ ๋ฐ์ธ๋ฉํ๋ผ๋ ๋ป์ผ๋ก ํด์๋๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ DataContext๋ฅผ ์์ ์ปจํ ์ด๋์ ํ ๋ฒ๋ง ์ง์ ํด๋๋ฉด ํ์์ ์ฌ๋ฌ ์ปจํธ๋กค์ด ์ผ์ผ์ด ๋ฐ์ธ๋ฉ ์์ค๋ฅผ ๋ช ์ํ์ง ์์๋ ๋๋ฏ๋ก ๊น๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Binding ๋ชจ๋: WPF ๋ฐ์ธ๋ฉ์ OneWay, TwoWay, OneTime, OneWayToSource ๋ฑ์ ์ ๋ฐ์ดํธ ๋ชจ๋๋ฅผ ๊ฐ์ง๋๋ค. - OneWay๋ ์์ค -> ํ๊ฒ (๋ฐ์ดํฐ -> UI) ๋จ๋ฐฉํฅ ์ ๋ฐ์ดํธ๋ก, ์ฃผ๋ก ์ถ๋ ฅ์ฉ ํ์ ๋ฑ์ ์ฐ์ ๋๋ค. - TwoWay๋ ์๋ฐฉํฅ์ผ๋ก, UI์์ ๋ณ๊ฒฝํ ๊ฐ์ด ์์ค์๋ ๋ฐ์๋๊ณ ์์ค ๋ณํ๋ UI์ ๋ฐ์๋ฉ๋๋ค (ํผ ์ ๋ ฅ ๋ฑ ์ํธ ํธ์ง์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ)blog.cwa.me.uk<ref>{{cite web|title=blog.cwa.me.uk|url=https://blog.cwa.me.uk/2008/02/21/the-morning-brew-37/#:~:text=The%20Morning%20Brew%20,config%20Files%20using|publisher=blog.cwa.me.uk|date=2008-02-21|access-date=2025-12-02}}</ref>. - OneTime์ ์ฐฝ ๋ก๋ ์ ํ ๋ฒ๋ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ดํ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค. - OneWayToSource๋ ํน์ดํ๊ฒ UI -> ์์ค ๋ฐฉํฅ ๋จ๋ฐฉํฅ์ผ๋ก, ๊ฑฐ์ ์ฌ์ฉ ๋น๋๊ฐ ๋ฎ์ต๋๋ค. ๊ธฐ๋ณธ ๋ชจ๋๋ ์ปจํธ๋กค์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ (์: TextBox.Text๋ TwoWay ๊ธฐ๋ณธ), ํ์์ ๋ฐ๋ผ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ๋ณ๊ฒฝ ํต์ง (INotifyPropertyChanged): TwoWay๋ OneWay ๋ฐ์ธ๋ฉ ์ ์์ค ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ UI์ ํต๋ณดํ๋ ค๋ฉด, ์์ค ํด๋์ค๊ฐ INotifyPropertyChanged ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-5-of-n#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%20,public%20event%20PropertyChangedEventHandler%20PropertyChanged%3B|publisher=codeproject.com|access-date=2025-12-02}}</ref>. ์ด ์ธํฐํ์ด์ค๋ PropertyChanged ์ด๋ฒคํธ ํ๋๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์์ค ์์ฑ์ด ๋ฐ๋ ๋ ๊ทธ ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋ฉด WPF ๋ฐ์ธ๋ฉ ์์ง์ด ์ด๋ฅผ ๊ฐ์งํ์ฌ UI๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์๋ฅผ ๋ค์ด Person ํด๋์ค์ Name ์์ฑ์ด ์์ ๋, set ์ ๊ทผ์์์ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));๋ฅผ ํธ์ถํ๋๋ก ๊ตฌํํด์ผ ํฉ๋๋ค. Part 5์์๋ ์ด ์ธํฐํ์ด์ค ๊ตฌํ ํจํด์ ์ง์ ์ฝ๋๋ก ๋ณด์ฌ์ฃผ๋ฉฐ, ๋ฐ์ธ๋ฉ์ด ์ ๋๋ก ๋์ํ๊ธฐ ์ํ ํ์ ์กฐ๊ฑด์์ ๊ฐ์กฐํฉ๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/articles/WPF-A-Beginner-s-Guide-Part-5-of-n#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%20,public%20event%20PropertyChangedEventHandler%20PropertyChanged%3B|publisher=codeproject.com|access-date=2025-12-02}}</ref>. (WPF์ ์ข ์์ฑ ์์ฑ์ ๋ณ๋๋ก INotifyPropertyChanged๊ฐ ์์ด๋ ์์ฒด ๋ณ๊ฒฝ ํต์ง๋ฅผ ํ์ง๋ง, ์ผ๋ฐ ํด๋์ค์ ์์ฑ์ ๋ฐ์ธ๋ฉํ ๋๋ INotifyPropertyChanged๊ฐ ํ์ํฉ๋๋ค.) ์ปฌ๋ ์ ๋ฐ์ธ๋ฉ: ๋ชฉ๋กํ ๋ฐ์ดํฐ๋ฅผ UI์ ๋ฐ์ธ๋ฉํ ๋๋ ObservableCollection<T>๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ์ด ์ปฌ๋ ์ ์ INotifyCollectionChanged๋ฅผ ๊ตฌํํ์ฌ, ์์ดํ ์ถ๊ฐ/์ญ์ /๊ฐฑ์ ์ UI (์: ListBox, DataGrid ๋ฑ)์ ์๋ ํต์งํฉ๋๋ค. Part 5์์๋ ๋ฆฌ์คํธ ๋ฐ์ธ๋ฉ์ ์ฌ๋ก๋ฅผ ๋ค๋ฃฐ ์ ์๋๋ฐ, ๋ณธ๋ฌธ์ ์ฃผ์ ์ด์ ์ ๊ฐ์ฒด์ ์์ฑ ๋ฐ์ธ๋ฉ์ด๋ฏ๋ก ObservableCollection ์ธ๊ธ์ด ๊ฐ๋ตํ ์๋ ์์ต๋๋ค. ๊ทธ๋๋ ์์๋๋ฉด ์ข์ ์ ์, WPF์์๋ ์ผ๋ฐ List<T>๋ฅผ ๋ฐ์ธ๋ฉํ๋ฉด ๋ณ๊ฒฝ ํต์ง๊ฐ ์ ๋์ด UI๊ฐ ๊ฐฑ์ ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ ๋ณํ๊ณผ ์ ํจ์ฑ: ๋ฐ์ธ๋ฉ ๋์ค ํ์์ด ๋ง์ง ์๊ฑฐ๋ ํํ์ ๋ค๋ฌ์ด์ผ ํ ๋ '''๊ฐ ๋ณํ๊ธฐ(IValueConverter)'''๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด DateTime ๊ฐ์ฒด๋ฅผ UI์ ํ์ํ ๋ ํน์ ๋ฌธ์์ด ํ์์ด ํ์ํ ์ ์๋๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ Converter๋ฅผ ํตํด ๋ณํ ๋ก์ง์ ์ฃผ์ ํฉ๋๋ค. ๋ํ ๋ฐ์ธ๋ฉ์๋ '''๊ฒ์ฆ(ValidationRules)'''์ ์ค์ ํ์ฌ ์๋ชป๋ ์ ๋ ฅ์ ๋ํด ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ์ ์ฃผ๋ ๊ธฐ๋ฅ๋ ์์ต๋๋ค. Part 5์์๋ ์ด๋ณด์ ๊ฐ์ด๋์ด๋ฏ๋ก Converter๋ Validation๋ณด๋ค๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ธ๋ฉ ์ค์ ๊ณผ INotifyPropertyChanged ์ชฝ์ ์ง์คํ์ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ค์ Part 5์ ์์ ์์๋ ๊ฐ๋จํ Person ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์ฑ์ ๋ฐ์ธ๋ฉํ UI๋ฅผ ์์ฐํ์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ ์คํธ ๋ฐ์ค ๋ ๊ฐ๋ฅผ ์๋ก ๋ฐ์ธ๋ฉํด์ ํ๋๋ฅผ ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ ์ชฝ๋ ๋ฐ๋๋ค๋ ์ง, ์ฌ๋ผ์ด๋์ ํ๋ก๊ทธ๋์ค๋ฐ๋ฅผ ๋ฐ์ธ๋ฉํด ์ฐ๋์ํค๋ ๋ฑ์ ๋๋ค. ์ด๋ฌํ ์์ ๋ฅผ ํตํด ์ป๋ ํต์ฌ ๋ฉ์์ง๋: '''โWPF ๋ฐ์ธ๋ฉ์ ์ฐ๋ฉด ๋ณ๋์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ์ฝ๋ ์์ด๋ UI์ ๋ฐ์ดํฐ๊ฐ ์ค์๊ฐ ๋๊ธฐํ๋๋ค.โ'''๋ ๊ฒ์ ๋๋ค. ์ด๋ WinForms ๋ฑ๊ณผ ๋น๊ตํด๋ณผ ๋ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๊ทน์ ์ผ๋ก ๋์ฌ์ฃผ๋ ํน์ง์ ๋๋ค. Part 5 ๊ธ์์ ์ค์ํ ๋ถ๋ถ ํ๋๋ ์๋ง๋ DataContext์ ์ ๋ฌ๊ณผ Element-to-Element ๋ฐ์ธ๋ฉ (๋ค๋ฅธ ์ปจํธ๋กค์ ์์ฑ์ ์์ค๋ก ์ผ๋ ๋ฐ์ธ๋ฉ)๋ ์ธ๊ธ๋์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด <Slider Name="s1" Minimum="0" Maximum="100"/>์ <ProgressBar Value="{Binding ElementName=s1, Path=Value}"/>์ฒ๋ผ ElementName๋ฅผ ํตํด ํน์ UI ์์์ ์์ฑ์ ์ฐธ์กฐํ๋ ๋ฐ์ธ๋ฉ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ DataContext ๊ฒฝ๋ก๊ฐ ์๋ ๋ณ๋๋ก UI ์์๋ฅผ ์ง์ ํ๋ ๋ฐฉ์์ด๋ฉฐ, ๊ตฌ์กฐ๊ฐ ๋ณต์กํ ๋ ์ ์ฉํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, Part 5์์๋ ๋ฐ์ธ๋ฉ์ด ์ ๋๋ก ๋์ํ์ง ์์ ๋ ๋ฌธ์ ๋ฅผ ์ง๋จํ๋ ํ(์ถ๋ ฅ ์ฐฝ์ ๋ฐ์ธ๋ฉ ์๋ฌ ๋ก๊ทธ ๋ฑ)์ด๋, ํํ ์ ์ง๋ฅด๋ ์ค์(์: DataContext๋ฅผ ์ค์ ์ ํ๋ค๊ฑฐ๋, ์์ฑ ์ด๋ฆ ์คํ ๋ฑ)์ ๋ํด์๋ ์ธ๊ธํ์ ์ ์์ต๋๋ค. ์ด๋ณด์ ๊ฐ์ด๋์ ๋งฅ๋ฝ์ ๋ฐ์ธ๋ฉ์ด ์ ๋ ๋ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ ์ ๋๋ ๊ฐ๋ตํ ์๊ฐ๋์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์์ฝํ์๋ฉด, Part 5๋ฅผ ํตํด ๋ ์๋ WPF ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ฐ๋ ๊ณผ ์ฅ์ ์ ๋ฐฐ์ฐ๊ณ , ์ด๋ฅผ ์ค์ตํด๋ณด๋ฉฐ INotifyPropertyChanged ๊ตฌํ ๋ฑ์ ๊ธฐ์ด๋ ์ตํ๊ฒ ๋ฉ๋๋คblog.cwa.me.uk<ref>{{cite web|title=blog.cwa.me.uk|url=https://blog.cwa.me.uk/2008/02/21/the-morning-brew-37/#:~:text=The%20Morning%20Brew%20,config%20Files%20using|publisher=blog.cwa.me.uk|date=2008-02-21|access-date=2025-12-02}}</ref>blog.cwa.me.uk<ref>{{cite web|title=blog.cwa.me.uk|url=https://blog.cwa.me.uk/2008/02/21/the-morning-brew-37/#:~:text=The%20Morning%20Brew%20,config%20Files%20using|publisher=blog.cwa.me.uk|date=2008-02-21|access-date=2025-12-02}}</ref>. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ดํ MVVM ํจํด ๋ฑ ๊ณ ๊ธ ์ฃผ์ ๋ก ๊ฐ๋ ๊ต๋๋ณด์ด๊ธฐ๋ ํ ๋งํผ, ์ด๋ณด์์๊ฒ ๋งค์ฐ ์ ์ฉํ ๋ด์ฉ์ ๋๋ค. ==== Part 6: ์คํ์ผ๊ณผ ํ ํ๋ฆฟ (Styles and Templates) ==== Part 6์์๋ WPF์ '''์คํ์ผ(Style)'''๊ณผ ํ ํ๋ฆฟ(Template) ๊ธฐ๋ฅ์ ๋ค๋ฃน๋๋คcnitblog.com<ref>{{cite web|title=cnitblog.com|url=http://www.cnitblog.com/seeyeah/archive/2008/12/06/52275.html#:~:text=WPF%20articles%20from%20CodeProject%20,of%20WPF%20By%20Josh|publisher=cnitblog.com|date=2008-12-06|access-date=2025-12-02}}</ref>. ์ด ์ฅ์ WPF UI ๋์์ธ์ ํฌ๊ฒ ํฅ์์ํค๋ ์ฃผ์ ์ธ๋ฐ, ์ปจํธ๋กค์ ๋ชจ์์์ ์ผ๊ด์ฑ์๋ ํ ๋ง ์ ์ฉ์ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค. Sacha Barber๋ Part 6์ '''โWPF ์คํ์ผ๊ณผ ํ ํ๋ฆฟ ์ ๋ฌธโ'''์ผ๋ก ์๊ฐํ๋ฉฐ, ์คํ์ผ/ํ ํ๋ฆฟ์ ๊ฐ๋ ๊ณผ ํ์ฉ๋ฒ, ํธ๋ฆฌ๊ฑฐ(Trigger)์ ๋ํด์ ์์ธํ ์ค๋ช ํฉ๋๋ค. ===== ์คํ์ผ (Style) ===== WPF์ Style์ ๋ง ๊ทธ๋๋ก ์คํ์ผ์ํธ ์ญํ ์ ํฉ๋๋ค. ํ ๊ณณ์ ์ปจํธ๋กค์ ์์ฑ ์ค์ ์ ๋ชจ์ ์ ์ํด๋๊ณ , ์ฌ๋ฌ ์ปจํธ๋กค์ ์ ์ฉํ์ฌ ์ผ๊ด๋ ๋์์ธ์ ์์ฝ๊ฒ ์ค ์ ์์ต๋๋ค. Style์ XAML์ <Window.Resources>๋ <Application.Resources> ๋ฑ์ <Style> ํ๊ทธ๋ก ์ ์ํฉ๋๋ค. ๊ฐ Style์๋ TargetType์ ์ง์ ํ์ฌ ์ด๋ค ์ปจํธ๋กค ์ ํ์ ์ ์ฉ๋๋์ง ๊ฒฐ์ ํ๊ณ , <Setter Property="FontSize" Value="14"/>์ฒ๋ผ ์์ฑ-๊ฐ ์์ Setter ๋ชฉ๋ก์ ๊ฐ์ง๋๋ค. ํน์ Style์ ๊ฐ๋ณ ์ปจํธ๋กค์ ์ ์ฉํ๋ ค๋ฉด Style="{StaticResource StyleKey}"์ฒ๋ผ ์ฐธ์กฐํ๊ณ , TargetType์ด ์ผ์นํ๋ ์ปจํธ๋กค์ด๋ฉด ํด๋น Setter๋ค์ด ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค. Style์ ์ฌ์ฉํ๋ฉด XAML ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ํ ๋ง ๋ณ๊ฒฝ๋ ์ฉ์ดํด์ง๋๋ค. ์๋ฅผ ๋ค์ด Button์ ๊ธฐ๋ณธ Style์ ํ๋ ์ ์ํด๋๋ฉด ์ฐฝ ์์ ๋ชจ๋ ๋ฒํผ์ ์ผ๊ด ์ ์ฉํ ์๋ ์์ต๋๋ค (์ด ๊ฒฝ์ฐ x:Key๋ฅผ ์๋ตํ๊ณ TargetType="Button"๋ง ์ฃผ๋ฉด ํด๋น ๋ฒ์ ๋ด ์์์ ์คํ์ผ์ด ๋์ด ๋ชจ๋ ๋ฒํผ์ ์๋ ์ ์ฉ๋ฉ๋๋ค). ์คํ์ผ์๋ '''ํธ๋ฆฌ๊ฑฐ(Trigger)'''๋ฅผ ํฌํจํ ์ ์๋ค๋ ์ ์ด ์ค์ํฉ๋๋ค. '''์์ฑ ํธ๋ฆฌ๊ฑฐ(Property Trigger)'''๋ ํน์ ์์ฑ ๊ฐ์ผ ๋ ๋ค๋ฅธ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ท์น์ด๊ณ , '''์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ(Event Trigger)'''๋ ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์ ๋๋ฉ์ด์ ๋ฑ ์ก์ ์ ์คํํ๋ ๊ท์น์ ๋๋ค. ์์ปจ๋ ์คํ์ผ ์์ <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="Yellow"/> </Trigger>๋ฅผ ๋ฃ์ผ๋ฉด, ๋์ ์ปจํธ๋กค์ ๋ง์ฐ์ค๊ฐ ์ฌ๋ผ์์ ๋ ๋ฐฐ๊ฒฝ์์ ๋ ธ๋์ผ๋ก ๋ฐ๊พธ๋ ํจ๊ณผ๋ฅผ ์ค ์ ์์ต๋๋ค. ์ด๋ฌํ ํธ๋ฆฌ๊ฑฐ ๋ฉ์ปค๋์ฆ์ ํตํด ์ํ์ ๋ฐ๋ฅธ ๋น์ฃผ์ผ ๋ณํ๋ฅผ XAML๋ง์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค (๋ณ๋์ ์ฝ๋ ์์ด). ===== ์ปจํธ๋กค ํ ํ๋ฆฟ (ControlTemplate) ===== ์ปจํธ๋กค ํ ํ๋ฆฟ์ WPF ์ปจํธ๋กค์ ์๊ฐ์ ์ธ ๊ตฌ์กฐ์ ์คํ์ผ ์ ์ฒด๋ฅผ ์ฌ์ ์ํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. WPF์ ์ปจํธ๋กค(๋ฒํผ, ์ฒดํฌ๋ฐ์ค ๋ฑ)์ ๋ชจ์๊ณผ ๋์์ด ๋ถ๋ฆฌ๋์ด ์๋๋ฐ, ControlTemplate์ ๋ฐ๊พธ๋ฉด ๋์์ ๊ทธ๋๋ก ๋๊ณ ๋ชจ์๋ง ๊ต์ฒดํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Button์ ์ ๋ชจ์์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, Button์ ๋ํ ControlTemplate๋ฅผ ์๋ก ์์ฑํด์ ์ฌ๊ฐํ Border ๋์ ์ํ ๋ํ์ผ๋ก ๊ตฌ์ฑํ๋ฉด ๋ฉ๋๋ค. ControlTemplate๋ <ControlTemplate TargetType="Button"> ... </ControlTemplate> ํ์์ผ๋ก XAML์ ์ ์ํ๋ฉฐ, ๋ด๋ถ์ ํด๋น ์ปจํธ๋กค์ ์๊ฐ์ ํธ๋ฆฌ๋ฅผ ๊ธฐ์ ํฉ๋๋ค. Template ๋ด๋ถ์์๋ {TemplateBinding PropertyName} ๊ตฌ๋ฌธ์ ์จ์ ์๋ ์ปจํธ๋กค์ ์์ฑ๊ณผ ์ ์๊ฐ ์์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค (์: <Ellipse Fill="{TemplateBinding Background}" .../> ์์ผ๋ก, ๋ฒํผ์ Background ๊ฐ์ ํ ํ๋ฆฟ ๋ด๋ถ์ Ellipse Fill์ ๋ฐ์ธ๋ฉ). ์ด๋ ๊ฒ ํ๋ฉด ์ปจํธ๋กค์ ์ฌ์ฉํ๋ ์ชฝ ์ฝ๋์๋ ๋ณํ๊ฐ ์์ง๋ง, ๋ณด์ด๋ ๋ชจ์ต์ ์์ ํ ์ปค์คํฐ๋ง์ด์ฆ๋ฉ๋๋ค. ControlTemplate ์ญ์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/Articles/24285/WPF-A-Beginner-s-Guide-Part-6-of-n#:~:text=Style%20%2C%20ControlTemplate%20%2C%20and,sets%20properties%20or%20starts|publisher=codeproject.com|access-date=2025-12-02}}</ref>. ์๋ฅผ ๋ค์ด ๋ฒํผ์ด ๋๋ ธ์ ๋(IsPressed=True) ํ ๋๋ฆฌ ์์ ๋ฐ๊พธ๊ฑฐ๋ ํ๋ ๊ฒ์ ControlTemplate ๋ด๋ถ Trigger๋ก ์ ์ ๊ฐ๋ฅํฉ๋๋ค. ์คํ์ผ์์๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ ์ํ ์ ์์ง๋ง, ControlTemplate ๋ด์ ํธ๋ฆฌ๊ฑฐ๋ ํ ํ๋ฆฟ์ผ๋ก ์์ฑ๋ ์๊ฐ์ ์์๋ค์ ๋์์ผ๋ก ํ ์๋ ์์ต๋๋ค. (์: <Trigger Property="IsFocused" Value="True"> <Setter TargetName="FocusRect" Property="Visibility" Value="Visible"/> </Trigger> ๋ฑ, Template์์ ์ด๋ฆ ๋ถ์ธ ์์์ ์์ฑ์ ๋ณ๊ฒฝ). Part 6์์๋ '''๋ฐ์ดํฐ ํ ํ๋ฆฟ(DataTemplate)'''๋ ๋ค๋ฃจ๋๋ฐ, ์ด๊ฒ์ ControlTemplate์ ์ ์ฌํ์ง๋ง ์ฃผ๋ก ๋ฐ์ดํฐ ๊ฐ์ฒด์ ํ์ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ํ ํ๋ฆฟ์ ๋๋ค. ์๋ฅผ ๋ค์ด ListBox๊ฐ Person ๊ฐ์ฒด ๋ชฉ๋ก์ ํ์ํ ๋, Person์ Name๊ณผ Age๋ฅผ ์กฐํฉํด ํ ์ค ๋ฌธ์์ด๋ก ๋ณด์ฌ์ฃผ๋๋ก DataTemplate์ ๋ง๋ค ์ ์์ต๋๋ค. DataTemplate๋ <DataTemplate DataType="{x:Type Person}"> ... </DataTemplate> ํํ๋ก ์ ์ํ์ฌ ํน์ ํ์ ์ ๋ฐ์ดํฐ๊ฐ ํ์๋ ๋ ์ฌ์ฉํ UI ๋ผ๋๋ฅผ ์ง์ ํฉ๋๋ค. ItemsControl (ListBox, ListView ๋ฑ)์ DataTemplate ์์ด๋ ๋ณดํต .ToString() ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์ง๋ง, DataTemplate์ ์ฃผ๋ฉด ํจ์ฌ ํ๋ถํ ํํ๋ก ๋ฐ์ดํฐ ํํ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ ํ ํ๋ฆฟ, ์์ดํ ํ ํ๋ฆฟ ๋ฑ์ ํํ๋ก ์ฐ์ด๋ฉฐ, XAML UI๋ฅผ ๋ฐ์ดํฐ์ ๋ง์ถฐ ํ์ฅํ๋ ๊ฐ๋ ฅํ ์๋จ์ ๋๋ค. Style, ControlTemplate, DataTemplate๋ WPF ๋ฃฉ์คํ(look & feel) ์ปค์คํฐ๋ง์ด์ง์ 3๋ ์์๋ผ๊ณ ํ ์ ์์ต๋๋ค. Sacha Barber์ ๊ธ์์๋ ์ด ์ ์ ๋ชจ๋ ๋ค๋ฃจ๋ฉด์, ํนํ '''ํธ๋ฆฌ๊ฑฐ(Trigger)'''์ ๋ํ ์ธ๊ธ์ ๋ถ๋ช ํ ํ์ ๊ฒ์ ๋๋ค. ์ค์ Part 6์ ํ ๊ตฌ์ ์ ๋ณด๋ฉด โStyle, ControlTemplate, DataTemplate ๋ชจ๋ Triggers ์์ฑ์ ๊ฐ์ ธ์ Trigger๋ค์ ํฌํจํ ์ ์๋ค. Trigger๋ ์ด๋ค ํ๋กํผํฐ ๊ฐ ๋ณํ๋ ์ด๋ฒคํธ ๋ฐ์์์ ์์ฑ์ ์ค์ ํ๊ฑฐ๋ ์ก์ ์ ์์ํ๋ ๊ธฐ๋ฅ์ด๋คโฆโ๋ผ๋ ์ค๋ช ์ด ์์ต๋๋คcodeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/Articles/24285/WPF-A-Beginner-s-Guide-Part-6-of-n#:~:text=Style%20%2C%20ControlTemplate%20%2C%20and,sets%20properties%20or%20starts|publisher=codeproject.com|access-date=2025-12-02}}</ref>learn.microsoft.com<ref>{{cite web|title=learn.microsoft.com|url=https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/styles-templates-overview#:~:text=Triggers,Style%2C|publisher=learn.microsoft.com|access-date=2025-12-02}}</ref>. ์ด๋ ์คํ์ผ/ํ ํ๋ฆฟ์์ ์ํ ๊ธฐ๋ฐ UI ๋ณ๊ฒฝ์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์์์ ๊ฐ์กฐํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, Part 6์์๋ ํ ๋ง์ ๊ธฐ๋ณธ ์คํ์ผ ๊ฐ๋ ๋ ์ธ๊ธ๋์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. WPF ์ปจํธ๋กค์ ๊ฐ์ ๊ธฐ๋ณธ ControlTemplate๋ฅผ ์ง๋๊ณ ์๊ณ , ์์คํ ํ ๋ง์ ๋ฐ๋ผ ๊ทธ ๋ชจ์ต์ด ๋ฐ๋๋๋ค. ์์ปจ๋ Windows 10 ํ ๋ง์์๋ Button์ด ๋ชจ๋ํ ํ๋ฉด ์คํ์ผ๋ก ๋ณด์ด์ง๋ง, Windows 7์์๋ ์ฝ๊ฐ ์ ์ฒด์ ์ผ๋ก ๋ณด์ด๋ ์์ ๋๋ค. WPF์์๋ <DefaultStyleKey>์ ํ ๋ง ์ ์ฉ ๋ฆฌ์์ค ๋๋ ํ ๋ฆฌ๋ฅผ ํตํด ๊ธฐ๋ณธ ์คํ์ผ์ ์ง์ ํฉ๋๋ค. Part 6์์๋ ๋๋ฌด ๊น๊ฒ ๋ค์ด๊ฐ์ง ์์๊ฒ ์ง๋ง, โLookless Controlโ ์ด๋ผ๋ ์ฉ์ด(์ปจํธ๋กค ๋ก์ง๊ณผ ๋ชจ์์ ๋ถ๋ฆฌ)๋ฅผ ์๊ฐํ๋ฉฐ ControlTemplate์ ์ฒ ํ์ ์ค๋ช ํ์ ์ ์์ต๋๋ค. Part 6์ ์์ ๋ก๋ ์ฌ์ฉ์ ์ ์ ์คํ์ผ/ํ ํ๋ฆฟ ์ ์ฉ์ ์ง์ ๋ณด์ฌ์คฌ์ ๊ฒ์ ๋๋ค. ์์ปจ๋ ๊ฐ๋จํ ๋ฒํผ ์คํ์ผ (๋ง์ฐ์ค ์ค๋ฒ ์ ์ ๋ณ๊ฒฝ, ํด๋ฆญ ์ ๋๋ฆฐ ํจ๊ณผ ๋ฑ)๊ณผ ์ปจํธ๋กค ํ ํ๋ฆฟ ๋ณ๊ฒฝ (์: ProgressBar๋ฅผ ํ ํ๋ฆฟ ๋ฐ๊ฟ ์ฌ์ฉ์ ์ง์ ๋ชจ์์ผ๋ก ํํ) ๋ฑ์ ์์ฐํ์ ์ ์์ต๋๋ค. ํนํ Toolbar ๋ฒํผ์ ๊ทธ๋ฆผ์ผ๋ก๋ง ํํํ๊ธฐ ๊ฐ์ ์ฌ๋ก๋, ๋ฆฌ์คํธ ์์ดํ ์ ์์ด์ฝ๊ณผ ํ ์คํธ๋ฅผ ํจ๊ป ๋ณด์ฌ์ฃผ๋ DataTemplate ์์ ๋ฑ์ด ํํ๋ฐ, Sacha Barber๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์์ ๋ฅผ ๋ค์๋์ง๊น์ง๋ ์ ์ ์์ง๋ง ํต์ฌ์ ๋์ผํฉ๋๋ค. ์คํ์ผ๊ณผ ํ ํ๋ฆฟ์ ํตํด ์ฝ๋ ์์ ์์ด๋ UI์ ๋ชจ์ต์ ์์ ์์ฌ๋ก ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์์ฝํ๋ฉด, Part 6์์๋ WPF UI๋ฅผ ๊พธ๋ฏธ๋ ๊ณ ๊ธ ๊ธฐ์ ์ธ ์คํ์ผ๊ณผ ํ ํ๋ฆฟ์ ๋ค๋ฃจ๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋์์ธ ์์ฐ์ ๋ง๋ค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ์ ์ฉํ ์ ์์์ ๋ณด์ฌ์ค๋๋คcnitblog.com<ref>{{cite web|title=cnitblog.com|url=http://www.cnitblog.com/seeyeah/archive/2008/12/06/52275.html#:~:text=WPF%20articles%20from%20CodeProject%20,of%20WPF%20By%20Josh|publisher=cnitblog.com|date=2008-12-06|access-date=2025-12-02}}</ref>. ํธ๋ฆฌ๊ฑฐ๋ฅผ ํ์ฉํ ์ํธ์์ฉ ๋์์ธ, ์ปจํธ๋กค ํ ํ๋ฆฟ์ ํตํ ์์ ํ ์คํจ ๊ต์ฒด ๋ฑ์ WPF๊ฐ UX ์ธก๋ฉด์์ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์์ ์ค๊ฐํ๊ฒ ํฉ๋๋ค. ์ด๋ก์จ Beginnerโs Guide ์๋ฆฌ์ฆ์ ๋ง์ง๋ง์ ์ฅ์ํ๋ฉฐ, ๋ ์๋ค์ WPF์ ๊ธฐ๋ณธ๋ถํฐ ๋น๊ต์ ๊ณ ๊ธ ์ฃผ์ ๊น์ง ์ผ๋ จ์ ๊ฐ๋ ์ ๋๋ฃจ ์ญ๋ ตํ๊ฒ ๋ฉ๋๋ค. ์ฐธ๊ณ ์๋ฃ: ๋ณธ ํด์ค์ Sacha Barber์ WPF: A Beginnerโs Guide 1~6๋ถ ์ฐ์ฌ๊ธ ๋ฐ ๊ด๋ จ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋คstackoverflow.com<ref>{{cite web|title=stackoverflow.com|url=https://stackoverflow.com/questions/29700/can-someone-point-me-to-some-guides-for-wpf#:~:text=Sacha%20Barber%20has%20a%20great,that%20you%20can%20check%20out|publisher=stackoverflow.com|access-date=2025-12-02}}</ref>codeproject.com<ref>{{cite web|title=codeproject.com|url=https://www.codeproject.com/Articles/23047/WPF-A-Beginner-s-Guide-Part-2-of-n?fid=983138&df=90&mpp=25&sort=Position&view=Normal&spc=Relaxed&prof=True&select=3551190&fr=1#:~:text=WPF%3A%20A%20Beginner%27s%20Guide%3A%20Part,NET%29|publisher=codeproject.com|access-date=2025-12-02}}</ref>cnitblog.com<ref>{{cite web|title=cnitblog.com|url=http://www.cnitblog.com/seeyeah/archive/2008/12/06/52275.html#:~:text=WPF%20articles%20from%20CodeProject%20,of%20WPF%20By%20Josh|publisher=cnitblog.com|date=2008-12-06|access-date=2025-12-02}}</ref>. ๊ฐ ๋ถ์ ๋ด์ฉ์ CodeProject์ ๊ฒ์๋ ์๋ฌธ๊ณผ ๊ทธ์ ๋ํ ๋ฒ์ญ/์ ๋ฆฌ๊ธ์ ์ฐธ๊ณ ํ์ฌ ์์ฝ๋์์ผ๋ฉฐ, WPF์ ๋์ ์๋ฆฌ์ ๋ํ ์ถ๊ฐ ์ค๋ช ์ ๋ง๋ถ์์ต๋๋ค. WPF์ ๋ ์์ธํ ์ฌํญ์ ๋ง์ดํฌ๋ก์ํํธ ๊ณต์ ๋ฌธ์์ ์ปค๋ฎค๋ํฐ ์๋ฃ๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ์ด๋ฒ ๊ฐ์ด๋๋ฅผ ํตํด WPF ์ ๋ฌธ์ ์ค์ํ ๊ฐ๋ ๋ค์ ๊น์ด ์๊ฒ ์ดํดํ๋ ๋ฐ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. == References == <references /> [[Category:ChatGPT Shares]] [[Category:openai]]
Summary:
Please note that all contributions to freem are considered to be released under the Creative Commons Attribution-ShareAlike 4.0 (see
Freem:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Templates used on this page:
Template:Cite web
(
edit
)
Module:Citation/CS1
(
edit
)
Module:Citation/CS1/COinS
(
edit
)
Module:Citation/CS1/Configuration
(
edit
)
Module:Citation/CS1/Date validation
(
edit
)
Module:Citation/CS1/Identifiers
(
edit
)
Module:Citation/CS1/Utilities
(
edit
)
Module:Citation/CS1/Whitelist
(
edit
)
Module:Citation/CS1/styles.css
(
edit
)