Microsoft-ui-xaml: ์ œ์•ˆ: ๋” ๋‚˜์€ F# ์ง€์›

์— ๋งŒ๋“  2019๋…„ 05์›” 22์ผ  ยท  23์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/microsoft-ui-xaml

์ œ์•ˆ: ๋” ๋‚˜์€ F# ์ง€์›

์š”์•ฝ


F# ์€ Visual Studio์—์„œ .NET ์ฝ˜์†” ์•ฑ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€๋งŒ UI ์•ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ธ๊ธฐ ์žˆ๋Š” ๊ธฐ๋Šฅ ์Šคํƒ€์ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. WinUI 3.0์„ ์‚ฌ์šฉํ•˜๋ฉด Xaml ์•ฑ์—์„œ F#์— ๋Œ€ํ•œ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ก ์  ํ•ด์„

๋” ๋‚˜์€ F# ์ง€์›์€ 3.0 ๋กœ๋“œ๋งต ํ† ๋ก  ๋ฌธ์ œ ์—์„œ WinUI๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๋กœ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด Xaml ์•ฑ์€ F#์˜ ๊ฐ„๊ฒฐํ•จ, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ, ํ˜•์‹ ์‹œ์Šคํ…œ ๋ฐ ์ •ํ™•์„ฑ ๋ณด์žฅ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์™€ ๊ฐ™์ด ๊ฐ€์žฅ ์ ์ ˆํ•œ ๊ฒฝ์šฐ F#์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ”์œ„


| ๊ธฐ๋Šฅ | ์šฐ์„ ์ˆœ์œ„ |
| :------------ | :--------- |
| ์•ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— F# ์‚ฌ์šฉ ํ™œ์„ฑํ™” | ํ•„์ˆ˜ |
| Xaml ์•ฑ์—์„œ Visual Studio F# ๋„๊ตฌ ์‚ฌ์šฉ ํ™œ์„ฑํ™” | ํ•„์ˆ˜ |
| F# ์ƒ˜ํ”Œ ์ œ๊ณต | ํ•ด์•ผ |
| ๋ถ€๋ถ„ ํด๋ž˜์Šค์—์„œ Xaml ํŽ˜์ด์ง€ ์ฝ”๋“œ ์ˆจ๊น€์— F# ์‚ฌ์šฉ ํ™œ์„ฑํ™” | ์ˆ˜ |
| ํ˜ผํ•ฉ ๋ฐ ์ผ์น˜ ์–ธ์–ด ์‚ฌ์šฉ(์˜ˆ: ๋ฐ์ดํ„ฐ ๋ฐ ๋…ผ๋ฆฌ์˜ ๊ฒฝ์šฐ F#, UI + ๋ฐ”์ธ๋”ฉ์˜ ๊ฒฝ์šฐ C#) | ์ˆ˜ |
| F# ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ ์ œ๊ณต | ์ˆ˜ |

์ค‘์š” ์ฐธ๊ณ  ์‚ฌํ•ญ

์—ด๋ฆฐ ์งˆ๋ฌธ

  1. ๊ธฐ์กด xlang ์ง€์›์ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ(์ƒˆ ์ƒ˜ํ”Œ ํฌํ•จ)?

  2. ์–ด๋–ค ์œ ํ˜•์˜ ํ…œํ”Œ๋ฆฟ์ด๋‚˜ ์ƒ˜ํ”Œ์ด ์œ ์šฉํ• ๊นŒ์š”?

  3. ์—ฌ๊ธฐ์— ์ง€์›ํ•˜๋Š” Xaml ํŽ˜์ด์ง€ ์ฝ”๋“œ ์ˆจ๊น€ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

  4. ์—ฌ๊ธฐ์—๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์–ธ์–ด๋ฅผ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

feature proposal needs-winui-3 team-Markup

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

F# ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
1) F#(๋ณ€๊ฒฝ ๊ฐ€๋Šฅ) ๋ ˆ์ฝ”๋“œ๋ฅผ XAML ๋ฐ”์ธ๋”ฉ/Gjallarhorn์— ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

2) ์—˜๋ฏธ์‰ฌ ์Šคํƒ€์ผ

๋‘˜ ๋‹ค ์ง€์›๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒ˜ํ”Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฏธ๋ž˜์—๋Š” 1๊ฐ€์ง€ ์ถ”์„ธ๋งŒ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.NET 5์˜ UI์šฉ F# ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  23 ๋Œ“๊ธ€

#736์˜ ์ค‘๋ณต

#736์˜ ์ค‘๋ณต

๋กœ๋“œ๋งต ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ PR์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿ˜Š

@jesbis ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. F#์ด ๋งŽ์„์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์„ ํ–‰๋ณตํ•˜๊ฒŒ ํ•˜๊ณ  WinUI 3.0์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ Microsoft ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์„ ํฌํ•จํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜€

F# ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
1) F#(๋ณ€๊ฒฝ ๊ฐ€๋Šฅ) ๋ ˆ์ฝ”๋“œ๋ฅผ XAML ๋ฐ”์ธ๋”ฉ/Gjallarhorn์— ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

2) ์—˜๋ฏธ์‰ฌ ์Šคํƒ€์ผ

๋‘˜ ๋‹ค ์ง€์›๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒ˜ํ”Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฏธ๋ž˜์—๋Š” 1๊ฐ€์ง€ ์ถ”์„ธ๋งŒ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.NET 5์˜ UI์šฉ F# ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ํ”„๋กœ์ ํŠธ์—์„œ F#๊ณผ C#์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์—๋Š” F#์„ ์‚ฌ์šฉํ•˜๊ณ  UI/๋ช…๋ น์—๋Š” C#์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

F# ์ „์šฉ + GUI๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜•์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
AF# ์ „์šฉ ์†”๋ฃจ์…˜์€ ์˜ˆ๋ฅผ ๋“ค์–ด Azure Function + F#์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฅผ TwoWay๋กœ TextBox์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒƒ๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

F#์˜ UI/๋ช…๋ น์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฉ‹์ง€๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@jesbis

  1. ์•ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— F# ์‚ฌ์šฉ ํ™œ์„ฑํ™” | ํ•ด์•ผํ•˜๋‹ค
  2. ํ˜ผํ•ฉ ๋ฐ ์ผ์น˜ ์–ธ์–ด ์‚ฌ์šฉ(์˜ˆ: ๋ฐ์ดํ„ฐ ๋ฐ ๋…ผ๋ฆฌ์˜ ๊ฒฝ์šฐ F#, UI + ๋ฐ”์ธ๋”ฉ์˜ ๊ฒฝ์šฐ C#) | ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค

์ด๋Š” ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๋ฉฐ WinUI๋ฅผ ์ฐธ์กฐํ•˜๋Š” C# ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋“  .Net ํ”„๋กœ์ ํŠธ๋„ ์ฐธ์กฐํ•˜๋„๋ก ํ—ˆ์šฉํ•จ์œผ๋กœ์จ ์•”์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฃผ์–ด์ง„ ๊ฒƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(nuget ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ WinUI์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •).

(๊ทธ๋Ÿฌ๋‚˜ 5.๊ฐ€ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์–ธ์–ด๋ฅผ ํ˜ผํ•ฉํ•˜๊ณ  ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๋ฉด C#๊ณผ F#์˜ ์ˆœ์„œ ์ฐจ์ด๋กœ ์ธํ•ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)

  1. Xaml ์•ฑ์—์„œ Visual Studio F# ๋„๊ตฌ ์‚ฌ์šฉ ํ™œ์„ฑํ™” | ํ•ด์•ผํ•˜๋‹ค

์ด๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? "Xaml"์€ ํ˜„์žฌ ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. "Xaml"์ด ๋งˆํฌ์—… ์–ธ์–ด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ ์œ ํ˜• ๊ณต๊ธ‰์ž๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ณต์žกํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ๋งํฌ ์ฐธ์กฐ). ๊ทธ๋Ÿฌ๋‚˜ "Xaml ์•ฑ"์ด "WinUI ์•ฑ"์„ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Š” 1์˜ ์ผ๋ถ€์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

  1. ๋ถ€๋ถ„ ํด๋ž˜์Šค์—์„œ Xaml ํŽ˜์ด์ง€ ์ฝ”๋“œ ์ˆจ๊น€์— F# ์‚ฌ์šฉ ํ™œ์„ฑํ™” | ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค

https://github.com/dotnet/wpf/issues/162 ์—์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค/XAML ์œ ํ˜• ๊ณต๊ธ‰์ž/BAML ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์ฐธ์กฐ

ํ˜„์žฌ F#์—์„œ๋Š” UWP UI๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ „์ฒด UI ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ(Win UI 3.0์—์„œ ๊ณ„ํš๋œ ๋Œ€๋กœ) ์ด๊ฒƒ์€ ์ตœ์†Œํ•œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ฉฐ, ์ €๋Š” ๊ทธ๊ฒƒ์„ ์ฐธ์„์„ฑ ์žˆ๊ฒŒ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

1: ๊ธฐ์กด xlang ์ง€์›์ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ(์ƒˆ ์ƒ˜ํ”Œ ํฌํ•จ)?
๊ฐœ์ธ์ ์œผ๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2: ์–ด๋–ค ์œ ํ˜•์˜ ํ…œํ”Œ๋ฆฟ์ด๋‚˜ ์ƒ˜ํ”Œ์ด ์œ ์šฉํ• ๊นŒ์š”?
๊ธฐ๋ณธ ์ƒ˜ํ”Œ์€ ์ข‹์€ ์ถœ๋ฐœ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3: ์—ฌ๊ธฐ์— ์ง€์›ํ•˜๋Š” Xaml ํŽ˜์ด์ง€ ์ฝ”๋“œ ์ˆจ๊น€ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
๋งŽ์€ F# ๊ฐœ๋ฐœ์ž๊ฐ€ UI ๊ตฌ์ถ•์„ ์œ„ํ•ด MVU ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ XAML + MVVM์€ ๊ฐ€๋ณ€์„ฑ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. UWP์— ํŠน์ •ํ•œ Fabolous ์™€ ๊ฐ™์€ ๊ฒƒ์ด ํฐ ํŒ๋งค ํฌ์ธํŠธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ œ ์ƒ๊ฐ์—๋Š”).
๊ธฐ๋ณธ์ ์œผ๋กœ MVU ์ถ”์ƒํ™”์™€ ๊ฐ™์€ Elm / React๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

4: ํ”„๋กœ์ ํŠธ์—์„œ ์–ธ์–ด๋ฅผ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•  ์ˆ˜/์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
์ด๊ฒƒ์ด ์—‰๋ง์ด ๋˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. F#์€ ํŒŒ์ผ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

.NET Core ์ง€์›์€ ์™„์ „ํžˆ F# ์ง€์›์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชฉํ‘œ๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด .NET Core 3.0์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด F# ์ง€์›๋„ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋””์ž์ด๋„ˆ์™€ ๊ฐ™์€ ๋„๊ตฌ ์ง€์› ์ˆ˜์ค€์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ _์•„๋‹™๋‹ˆ๋‹ค_.

F#(๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ) ๋ ˆ์ฝ”๋“œ XAML์ด ๋ฐ”์ธ๋”ฉ ์นœํ™”์ ์ด๊ณ  UI ๋ช…๋ น์ด ํฌํ•จ๋œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋””์ž์ด๋„ˆ๊ฐ€ C#์˜ ๋™์ผํ•œ ๋„๊ตฌ๋กœ ์ž‘๋™ํ•˜๊ณ  F#์— "์ฝ”๋“œ ์ˆจ๊น€" + ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .

์˜ˆ: ๊ณ ๊ฐ, ์†ก์žฅ, ์†ก์žฅ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ์†ก์žฅ ํ™”๋ฉด์˜ WinUI GUI๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ƒˆ ์†ก์žฅ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๊ฐ์„ ์„ ํƒํ•˜๊ณ  ์†ก์žฅ ํ•ญ๋ชฉ ์ถ”๊ฐ€/์ œ๊ฑฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

F#์—์„œ ๋ชจ๋ธ๋งํ•˜๊ณ  UI์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  F# ๊ธฐ๋Šฅ์— ๋ฒ„ํŠผ ๋ช…๋ น์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@TonyHenrique .Net UI(WPF/UWP/Xamarin/Avalonia)์˜ ๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ์‹ฌ๊ฐํ•œ ์•ฝ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์•ˆ์ „์„ฑ์ด ์™„์ „ํžˆ ๊ฒฐ์—ฌ๋˜๊ณ  ๋งต("๋ณ€ํ™˜๊ธฐ")์˜ ํ•ดํ‚น ๊ตฌํ˜„, ๋„์ฒ˜์— ์žˆ๋Š” ๋งˆ๋ฒ• ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. F#์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ธํ”„๋ผ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ค‘๊ฐ„ ์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ์  ์ ‘๊ทผ ๋ฐฉ์‹(Gjallarhorn๊ณผ ๊ฐ™์€ ๋ฐ˜์‘์  ์ ‘๊ทผ ๋ฐฉ์‹ - ๋ฐ”์ธ๋”ฉ ๊ตฌํ˜„์ด ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋œ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” ๊ทน๋‹จ์ ์ธ ๊ธฐ๋Šฅ์  ์ ‘๊ทผ ๋ฐฉ์‹(Elmish, ์˜ˆ: Fabulous)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ์—๋งŒ xaml์„ ์‚ฌ์šฉํ•˜๊ณ  ํ˜•์‹ ๊ณต๊ธ‰์ž๊ฐ€ UI ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(WPF์šฉ FsXaml์—์„œ์™€ ๊ฐ™์ด).

WinUI XAML F# ์œ ํ˜• ๊ณต๊ธ‰์ž ๋Š” ์ด๋ฒคํŠธ ๋ฐ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ฝ”๋“œ์—์„œ UI ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฉ‹์ง„ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋ฐ˜ WinUI XAML ๋””์ž์ธ ์‹œ๊ฐ„ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(elmish์—์„œ ๋‚˜๋ฅผ ๊ฑฑ์ •์‹œํ‚ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ ๋‚ด๋ถ€์— ํ˜ผํ•ฉ๋œ ํฌ๊ณ  ๋ณต์žกํ•œ UI์˜ ๊ฒฝ์šฐ ์˜ค๋ž˜๋œ PHP ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Gjallarhorn ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ F# ํŒ€์˜ ๋ชซ์ž…๋‹ˆ๋‹ค)

์ด์ œ WinUI .xaml ํŒŒ์ผ๊ณผ .fs ํŒŒ์ผ์ด ์žˆ๋Š” ์ ์ ˆํ•œ UI/์ฝ”๋“œ ๋ถ„๋ฆฌ ์ƒ˜ํ”Œ๊ณผ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์Šคํ•˜์‹ญ์‹œ์˜ค. ์ด ํŒŒ์ผ์—๋Š” ๊ณ ๊ฐ, ์†ก์žฅ, ์†ก์žฅ ํ•ญ๋ชฉ ๋ฐ ํ•ญ๋ชฉ ์ถ”๊ฐ€/์ œ๊ฑฐ ๋ฒ„ํŠผ์˜ 3๊ฐ€์ง€ ์ˆ˜์ค€ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ์ฐฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. , ์˜ˆ๋ฅผ ๋“ค์–ด.

์ด ๋„๊ตฌ์™€ _Azure Functions F# ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ_์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ํ”„๋กœ์ ํŠธ์—์„œ F#์œผ๋กœ ์™„์ „ํžˆ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์ž‘์—…์€ C#/F# ์ฝ”๋“œ์—์„œ XAML ๋ฆฌํ„ฐ๋Ÿด์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

let myButton title = <Button Text=title />

์ €์™€ ๊ฐ™์€ XAML ํŒฌ์—๊ฒŒ๋Š” ์นœ์ˆ™ํ•˜๊ฒŒ ๋ณด์ด๊ณ  React ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋ณด๊ธฐ๋ฅผ ์„ ์–ธํ•˜๋Š” Fabulous/Fable ๋ฐฉ์‹์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

@tonyhenrique ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. F#์—์„œ UI๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ MS์˜ ๋ชซ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Elmish ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋””์—์„œ๋‚˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๋Š” ๊ฒƒ๋ณด๋‹ค F#์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@isaacabraham WinUI XAML ์œ ํ˜• ๊ณต๊ธ‰์ž์™€ ํ•จ๊ป˜ Elmish MVU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ„๋„์˜ XAML ํŒŒ์ผ์— UI ์„ ์–ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋ฐ˜ XAML ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ F#์˜ ๋ถˆ๋ณ€์„ฑ๊ณผ ํ˜•์‹ ์•ˆ์ „์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

MS๊ฐ€ ์ด๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ์—๋Š” ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๋ฐฉ์‹(๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ฝ”๋“œ ๋ฐ”์ธ๋”ฉ, gjallahorn ๋˜๋Š” elmish๋ฅผ ๋ณ„๋„์˜ XAML ํŒŒ์ผ๋กœ ๋ฐ”์ธ๋”ฉ)์— ๋Œ€ํ•œ ์ ์ ˆํ•œ F# GUI Visual Studio ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์ด ์žˆ์œผ๋ฉด ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์— ๋งค์šฐ ํฅ๋ฏธ๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

WinUI์— ๋Œ€ํ•ด์„œ๋Š” ์–ธ๊ธ‰ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๊ธฐ๋ณธ ์ œ๊ณต VS XAML ๋””์ž์ด๋„ˆ + XAML ํ˜•์‹ ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ์ˆ˜ F# ์†”๋ฃจ์…˜์— WPF ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ์˜ค๋Š˜๋‚  Elmish WPF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด์ง€๋งŒ FSharp.ViewModule์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์— ๊ด€ํ•ด์„œ๋Š” ๋งŒ๊ฐ์ด ๊ต์ฐจํ•ฉ๋‹ˆ๋‹ค. ์ฒซ์งธ, ๋งˆ์ผ€ํŒ… ๋ฐ ์ธ์ง€๋„๋ฅผ ๋†’์ด๋Š” ๋„๊ตฌ๋กœ ์œ ์šฉํ•˜์ง€๋งŒ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์œ ์—ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์†”๋ฃจ์…˜ IMHO๋Š” dotnet ํ…œํ”Œ๋ฆฟ ๋ฐ/๋˜๋Š” nuget ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. VS์— ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ”๋“œ์— ๋” ์ค‘์ ์„ ๋‘” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น IMHO์—์„œ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ด๋™ํ•ด์•ผ ํ•จ).

์ด๊ฒƒ์€ ๋˜ํ•œ ์ด๊ฒƒ์ด "MS" ๊ฒฐ์ •์ธ์ง€ ์•„๋‹ˆ๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ฃผ๋„ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด MS์— ์˜์กดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋Šฅ๋™์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@mdtauk @TonyHenrique @charlesroddie @JaggerJo @cartermp @Happypig375 @isaacabraham ๋ฐ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์‚ฌ๋ ค ๊นŠ์€ ์˜๊ฒฌ์„ ์ฃผ์‹  ๋‹ค๋ฅธ ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ €๋Š” UWP Xaml ํŒ€์ด F# ์ง€์›์— ํˆฌ์žํ• ์ง€ ์—ฌ๋ถ€์™€ ํˆฌ์ž ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋„๋ก ๋•๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. F# ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ง€์›์ด ๊ฐ€์žฅ ๋„์›€์ด ๋ ๊นŒ์š”?

@kathyang : ์ €์—๊ฒŒ ๊ฐ€์žฅ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ Visual Studio 2019์šฉ F# WinUI GUI ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ ์ด ์žˆ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ ์—๋Š” WinUI XAML Type Provider ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ์ผ๋ฐ˜ XAML ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Gjallarhorn์—์„œ F# ์ฝ”๋“œ ๋น„ํ•˜์ธ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ/๋˜๋Š” ์—˜๋ฏธ์‰ฌ.

@kathyang ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์‚ฌํ•ญ์€ nuget ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด UWP๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  .Net ์–ธ์–ด์—์„œ UWP ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€ ์œ ํ˜• ๊ณต๊ธ‰์ž๋ฅผ ๋งŒ๋“œ๋Š” ์ž‘์—…์€ ๊ฐ์‚ฌํ•  ๊ฒƒ์ด์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ž์„ธํ•œ ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ 3๊ฐ€์ง€ ์œ ํ˜• ๊ณต๊ธ‰์ž๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ˜„์žฌ @ReedCopsey ํ•œ ๋ช…์ด FsXaml WPF ์œ ํ˜• ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ ๊ฐœ๋ฐœ๋œ UWP ํ˜•์‹ ๊ณต๊ธ‰์ž๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ž‘์—…์„ ์ •๋‹นํ™”ํ•  ์šฉ๋„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ Xaml ํ”Œ๋ ˆ์ด๋ฒ„๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” WPF/UWP/XF์— ๋Œ€ํ•ด ํ˜•์‹ ๊ณต๊ธ‰์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜•์‹ ๊ณต๊ธ‰์ž๋Š” F# ์‚ฌ์šฉ์— ๋™์ผํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  Xaml์— ๋Œ€ํ•œ ์ง€์›์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(C# ๊ฐœ๋ฐœ์ž๋Š” ์ข…์ข… Xaml์˜ ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ View ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ์—†์Œ์„ ์˜นํ˜ธํ•จ).

@TonyHenrique ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์˜ต์…˜์œผ๋กœ ํŒ€๊ณผ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@charlesroddie ์œ ํ˜• ์ œ๊ณต์ž์— ๋Œ€ํ•œ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ - ๋‹น์‹ ์ด ๋งํ•œ ๋•Œ๋ถ€ํ„ฐ ๋‹น์‹ ์—๊ฒŒ ํ‰๊ท  ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ "UWP๊ฐ€ nuget ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์„ค์น˜ ๋  ์ˆ˜ ์žˆ๋„๋ก์ด ๋ชจ๋“  .NET ์–ธ์–ด์—์„œ UWP ๋ทฐ์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค." ์ด ?

@kathyang Microsoft.UI.Xaml์€ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค(์ด๋ฆ„ ์ง€์ • ์ œ์™ธ). ์ด๊ฒƒ์ด ๋ชจ๋“  .Net ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  UWP View ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ F# ์ง€์›์˜ ์ฃผ์š” ๋‹จ๊ณ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ Microsoft.UI.Xaml์€ ํŠน์ˆ˜ UWP ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ(F#์—๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์Œ) .Net Standard ํ”„๋กœ์ ํŠธ( The namespace UI is not defined )์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ์ตํ•œ ์ง€์‹์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ ํŒ€์€ ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ WinUI 2.2 ๋ฐ WinUI 3 ๋ฐ ์ด ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋  ๋งŽ์€ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋กœ์„œ๋Š” ์ด์— ํˆฌ์žํ•  ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ WinUI 3๊ฐ€ ์ถœ์‹œ๋˜๊ณ  XAML ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ OS์—์„œ ๋ถ„๋ฆฌ๋˜๋ฉด ์šฐ๋ฆฌ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ด๋ฅผ ํ•จ๊ป˜ ์žฌ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— needs-winui-3 ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์—์„œ F# ์ง€์›์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๊ณ„์† ๊ณต์œ ํ•˜์—ฌ ๋‚˜์ค‘์— ์ด ๋ฌธ์ œ๋กœ ๋Œ์•„์˜ฌ ๋•Œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰