Maui: [์‚ฌ์–‘] ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ ์•„ํ‚คํ…์ฒ˜

์— ๋งŒ๋“  2020๋…„ 05์›” 19์ผ  ยท  56์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/maui

๊ฒฝ๊ณ : ์ด ์‚ฌ์–‘์€ ์—ฌ์ „ํžˆ โ€‹โ€‹WIP์ด๋ฉฐ ์ด ๊ฐœ๋…์„ ๊ณ„์† ์‹คํ—˜ ์ค‘์ž…๋‹ˆ๋‹ค.

์„ค๋ช…

์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์ค‘ ํƒ€๊ฒŸํŒ… ๋ฐ ๋‹จ์ผ ํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ์˜ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

EntryRenderer.cs

public partial class EntryRenderer {
   public static PropertyMapper<IView> ViewMapper = new PropertyMapper<IView> {

     // Add your own method to map to any property         
     [nameof(IView.BackgroundColor)] = MapBackgroundColor

   };
}

EntryRenderer.iOS.cs

// You donโ€™t need to register a new renderer.
public partial class EntryRenderer
{
     // You know what method to call because you named it!
   public static void MapBackgroundColor (IViewRenderer renderer, IView view)
     {
        // You donโ€™t need to call any base methods here or worry about order.

        // Every renderer is consistent; you know where the native view is.
          var nativeView = (NativeView)renderer.NativeView;
          var color = view.BackgroundColor;

          if (color != null) {

            // Phew! That was easy!         
            nativeView.BackgroundColor = UIColor.FromRGB (204, 153, 255);
          }
     }
}

๋ Œ๋”๋Ÿฌ์˜ ํ‘œ์ค€ํ™”

๋ชจ๋“  ๊ธฐ๋ณธ ๋ Œ๋”๋Ÿฌ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์ด ์•„ํ‚คํ…์ฒ˜๋กœ ์ด์‹๋ฉ๋‹ˆ๋‹ค.

๋ Œ๋”๋Ÿฌ ๋“ฑ๋ก

rendererRegistrar๋Š” ์ข…์†์„ฑ ์„œ๋น„์Šค์— ์กด์žฌํ•˜๋ฉฐ serviceCollection.Get<IRendererRegistrar>() ์˜ํ•ด ์•ก์„ธ์Šค๋˜์–ด ์–ด๋–ค ๋ Œ๋”๋Ÿฌ๊ฐ€ ์–ด๋–ค ์ปจํŠธ๋กค์— ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋Ÿฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค

๋งคํผ ๊ฐœ๋…

์†์„ฑ ๋งคํผ๋Š” ์‘๋‹ต ์†์„ฑ ๋ณ€๊ฒฝ์—์„œ ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ ์ž์ฒด๋Š” ์†์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌ๋…ํ•˜์ง€ ์•Š์ง€๋งŒ ์„ ์–ธ๋œ ์ผ๋ถ€ ์ž‘์—…์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค์˜ ์†์„ฑ ๋งคํผ ์†์„ฑ์€ public static ์ด๋ฉฐ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ๋งคํผ๋Š” ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„์—์„œ ์—ญํ• ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ฒ„ํŠผ ํด๋ฆญ, ํ…์ŠคํŠธ ์ž…๋ ฅ)

TODO: ๋งคํผ ํ‚ค์— ๋ฌด์—‡์„ ์‚ฌ์šฉํ• ์ง€ ๋…ผ์˜ํ•ฉ๋‹ˆ๋‹ค. string ๋˜๋Š” object ? ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(BindableProperties์˜ ๊ฒฝ์šฐ) ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด์ „ ๋ Œ๋”๋Ÿฌ์— ๋”ฐ๋ผ ํƒ€์‚ฌ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ธฐ์กด ๋ Œ๋”๋Ÿฌ๋ฅผ ๋ณด์™„ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด ์•„ํ‚คํ…์ฒ˜์˜ ์ƒˆ๋กœ์šด ํ™•์žฅ์„ฑ ๋ชจ๋ธ์€ ์†์„ฑ ๋งคํผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์†์„ฑ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ƒˆ ์†์„ฑ์„ ๋งคํ•‘ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ์ด ์กด์žฌํ•˜๋ ค๋ฉด ์ปจํŠธ๋กค์„ ์„œ๋ธŒํด๋ž˜์‹ฑํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ Œ๋”๋Ÿฌ๋ฅผ ์„œ๋ธŒํด๋ž˜์‹ฑํ•˜๋Š” ๊ฒƒ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์œ„ ํ˜ธํ™˜์„ฑ

๊ธฐ์กด ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ์™€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋Š”์ง€ ๋˜๋Š” ์ด์ „ ๋ Œ๋”๋Ÿฌ์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ด ์•„ํ‚คํ…์ฒ˜์— ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ์—ฌ๋ถ€

๋‚œ์ด๋„ : ๋งค์šฐ ๋†’์Œ

proposal-open slim renderer

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

์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. XF์™€ ํ˜ธํ™˜๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋” ๋‚˜์€ ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Xamarin์€ wpf ๋ Œ๋”๋Ÿฌ์™€ ButtonRenderer์™€ ๊ฐ™์€ ์ผ๋ถ€ Android ๋ Œ๋”๋Ÿฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉฐ ์—ฌ๊ธฐ์„œ "๋น ๋ฅธ"์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋น ๋ฅด๊ฑฐ๋‚˜ ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@ysmoradi ๋„ต! ์ด๋Ÿฌํ•œ ์ƒˆ ๋ Œ๋”๋Ÿฌ๋Š” ๋น ๋ฅธ ๋ Œ๋”๋Ÿฌ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค(์ฆ‰, ๊ธฐ๋ณธ ๋ณด๊ธฐ ์ฃผ์œ„์— ๋ž˜ํผ ๋ณด๊ธฐ ์—†์Œ). Android ๋ฐ WPF๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. XF์™€ ํ˜ธํ™˜๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋” ๋‚˜์€ ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Skia ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ Œ๋”๋ง๋˜๋Š” C#์œผ๋กœ ์™„์ „ํžˆ ์ž‘์„ฑ๋œ ๋งคํ•‘ ๋ฐ ๋™์ž‘ ๋…ผ๋ฆฌ ์—†์ด ์ž์ฒด ์ปจํŠธ๋กค ์„ธํŠธ๋กœ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜๋œ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋žซํผ ๋””์ž์ธ ์ง€์นจ์„ ์ผ์น˜์‹œํ‚ค๋ ค๊ณ  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํ•„์š”๋Š” ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ž ์ •์˜์˜ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ์™œ ๋ Œ๋”๋Ÿฌ ์•„ํ‚คํ…์ฒ˜๋ณด๋‹ค ์ด์ ์ด ๋” ๋งŽ์€์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”Œ๋žซํผ๋ณ„ ๋ Œ๋”๋Ÿฌ ๋Œ€์‹  ํ”Œ๋žซํผ ๊ฐ„ ๋ Œ๋”๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Skia-sharp ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜์—ฌ Button ์ปจํŠธ๋กค์„ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ๋Š” ์ž˜๋ชป๋œ ๋””์ž์ธ์ž…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ํ”Œ๋žซํผ ์ œํ•œ์œผ๋กœ ์ธํ•ด UWP๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” xamarin ์ œ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
UWP์˜ ๊ทธ๋ฆผ์ž๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ์„œ๋ฆฌ ๋ฒ„ํŠผ์—์„œ ๋ชจ์„œ๋ฆฌ ๊ทธ๋ฆผ์ž๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ๋ฒ„ํŠผ ํ…œํ”Œ๋ฆฟ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค).

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ Œ๋”๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ flutter๋Š” ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ ์œผ๋กœ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์ „์ฒด ์•ฑ์„ ์‚ฌ์šฉ์ž ์ง€์ • 2D ์บ”๋ฒ„์Šค๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋“œ๋ž˜๊ทธ ๋“œ๋กญ, ํ…์ŠคํŠธ ์„ ํƒ, ํ…์ŠคํŠธ ์กฐ์ž‘์„ ์œ„ํ•œ ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค ๋“ฑ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž‘์—…์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์Šคํฌํ†ฑ ์•ฑ์ด๋‚˜ ๋ณต์žกํ•œ ์•ฑ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Skia ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ Œ๋”๋ง๋˜๋Š” C#์œผ๋กœ ์™„์ „ํžˆ ์ž‘์„ฑ๋œ ๋งคํ•‘ ๋ฐ ๋™์ž‘ ๋…ผ๋ฆฌ ์—†์ด ์ž์ฒด ์ปจํŠธ๋กค ์„ธํŠธ๋กœ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜๋œ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋žซํผ ๋””์ž์ธ ์ง€์นจ์„ ์ผ์น˜์‹œํ‚ค๋ ค๊ณ  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํ•„์š”๋Š” ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ž ์ •์˜์˜ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ์™œ ๋ Œ๋”๋Ÿฌ ์•„ํ‚คํ…์ฒ˜๋ณด๋‹ค ์ด์ ์ด ๋” ๋งŽ์€์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „์ฒด ์•ฑ์„ ์‚ฌ์šฉ์ž ์ง€์ • 2D ์บ”๋ฒ„์Šค๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋“œ๋ž˜๊ทธ ๋“œ๋กญ, ํ…์ŠคํŠธ ์„ ํƒ, ํ…์ŠคํŠธ ์กฐ์ž‘์„ ์œ„ํ•œ ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค ๋“ฑ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž‘์—…์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์Šคํฌํ†ฑ ์•ฑ์ด๋‚˜ ๋ณต์žกํ•œ ์•ฑ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Skia ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ Œ๋”๋ง๋˜๋Š” C#์œผ๋กœ ์™„์ „ํžˆ ์ž‘์„ฑ๋œ ๋งคํ•‘ ๋ฐ ๋™์ž‘ ๋…ผ๋ฆฌ ์—†์ด ์ž์ฒด ์ปจํŠธ๋กค ์„ธํŠธ๋กœ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜๋œ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋žซํผ ๋””์ž์ธ ์ง€์นจ์„ ์ผ์น˜์‹œํ‚ค๋ ค๊ณ  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํ•„์š”๋Š” ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ž ์ •์˜์˜ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ์™œ ๋ Œ๋”๋Ÿฌ ์•„ํ‚คํ…์ฒ˜๋ณด๋‹ค ์ด์ ์ด ๋” ๋งŽ์€์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒ€์ด ๋‹จ ํ•˜๋‚˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋„๋ก ๊ฐ•์š”๋ฐ›๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์•„์š”. ๋‚ด ๋ง์€ ๊ทธ๋“ค์ด .net 6๊ณผ ํ•จ๊ป˜ "์™„์ „ํžˆ ์ƒˆ๋กœ์šด" ์™„์ „ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ 1๋…„ ์•ˆ์— ์ถœ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ž˜ ๋™์•ˆ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ์ข‹์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋œ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ๊ณ  ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ์ปค์Šคํ…€ 2D ์บ”๋ฒ„์Šค ๋ Œ๋”๋ง์ด ํ›จ์”ฌ ๋” ๋งŽ์€ ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ "ํฌ๋กœ์Šค ํ”Œ๋žซํผ"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. Xamarin ์–‘์‹์€ ์ •๋ง ์ข‹์€ ๊ธฐ๋Šฅ์ด๋ฉฐ ์˜ค๋Š˜๋‚  ์—„์ฒญ๋‚œ ๋ฐœ์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์†ํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. Microsoft์™€ xamarin ํŒ€์€ ๋งค์šฐ ์˜๋ฆฌํ•œ ์—”์ง€๋‹ˆ์–ด๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜ http://avaloniaui.net/ ์„ ๋น„์žฅ์˜ ์นด๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Skia ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ Œ๋”๋ง๋˜๋Š” C#์œผ๋กœ ์™„์ „ํžˆ ์ž‘์„ฑ๋œ ๋งคํ•‘ ๋ฐ ๋™์ž‘ ๋…ผ๋ฆฌ ์—†์ด ์ž์ฒด ์ปจํŠธ๋กค ์„ธํŠธ๋กœ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜๋œ ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋žซํผ ๋””์ž์ธ ์ง€์นจ์„ ์ผ์น˜์‹œํ‚ค๋ ค๊ณ  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํ•„์š”๋Š” ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ž ์ •์˜์˜ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ์™œ ๋ Œ๋”๋Ÿฌ ์•„ํ‚คํ…์ฒ˜๋ณด๋‹ค ์ด์ ์ด ๋” ๋งŽ์€์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Skia ๊ฐœ๋ฐœ์ž๊ฐ€ 100% ๋ณ€๊ฒฝํ•˜์—ฌ ํ’๋ถ€ํ•œ ๋””์ž์ธ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก 4์ฐจ ๋ Œ๋” ๊ธฐ๋ณธ ํšŒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ‹์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐฑ์ฝค ๊ฐ€๋Šฅ์„ฑ์„ ์œ„ํ•ด 3๊ฐœ๋Š” ๊ทธ๋Œ€๋กœ ๋‘์ง€๋งŒ "๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง์ ‘ ๊ทธ๋ฆฌ์‹ญ์‹œ์˜ค"_skia_render๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์— ๋Œ€ํ•œ 90%์˜ ์ฑ…์ž„์„ ์ง‘๋‹ˆ๋‹ค.

๋ Œ๋”๋Ÿฌ์˜ ๊ฐœ๋…์ด ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด INotifyPropertyChanged ๋ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ๊ณต์œ  UI ์ฝ”๋“œ์™€ ๋ Œ๋”๋Ÿฌ ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฆ‰

  • ๊ณต์œ  ์ปจํŠธ๋กค์— _property_๋ฅผ ์„ค์ •ํ•˜๊ณ  PropertyChanged ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋Œ€์‹  ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ์—์„œ ์ง์ ‘ ์†์„ฑ์„ ๋งคํ•‘ํ•˜๊ณ  ์„ค์ •ํ• 
  • ๊ณต์œ  ์ปจํŠธ๋กค์—์„œ _method_๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋ Œ๋”๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹  ๋ฉ”์„œ๋“œ๋ฅผ ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ์—์„œ ์ง์ ‘ ๋งคํ•‘ํ•˜๊ณ  ๊ด€๋ จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

INotifyPropertyChanged ๋Š” MVVM ๋””์ž์ธ ๋ฐ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๋ทฐ ๋ชจ๋ธ์— ์ ํ•ฉํ•˜์ง€๋งŒ ๊ณต์œ  UI ์ฝ”๋“œ์™€ ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ ์‚ฌ์ด์˜ ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ•ญ์ƒ ํˆฌ๋ฐ•ํ•˜๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋” ๋‚˜์€ ์„ฑ๋Šฅ, ๊ณต์œ  UI์™€ ๋ Œ๋”๋Ÿฌ ๋ ˆ์ด์–ด ๊ฐ„์˜ '์ˆ˜๋‹ค' ๊ฐ์†Œ, ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ธธ์ง€๋งŒ ๋งˆ์šฐ์ด์˜ "์•ผ๊ตฌ ๋‚ด๋ถ€"๋ฅผ ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://www.youtube.com/watch?v=_MGh3xipWm4

๋งˆ์šฐ์ด์˜ ์•„ํ‚คํ…์ฒ˜๋Š” ํ”Œ๋žซํผ์—์„œ ๋ Œ๋”๋ง๋œ ์ปจํŠธ๋กค๊ณผ ์บ”๋ฒ„์Šค๋กœ ๊ทธ๋ฆฐ ์ปจํŠธ๋กค์„ ๋ชจ๋‘ ์ง€์›ํ•  ๊ฒƒ์ด๋ฉฐ, ๋” ๋‚˜์•„๊ฐ€ ๊ณ ๊ท€ํ•œ @Clancey ๋Š” MVU ํ”Œ๋ ˆ์ด๋ฒ„์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋งˆ์šฐ์ด์šฉ ์Šคํ‚ค ๊ธฐ๋ฐ˜ ๋ Œ๋” ์„ธํŠธ์—์„œ ๊ณ„์† ์ž‘์—…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์šฐ์ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ MVVM ํŒจํ„ด์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์–ธ๋œป ๋ณด๊ธฐ์— Maui๋Š” Forms์˜ ๋ธŒ๋žœ๋“œ ๋ณ€๊ฒฝ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๋ ˆ์ด์–ด๋ฅผ ๋” ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋งŽ์€ ๊ฒƒ์„ ์ง€์›ํ•˜๋„๋ก Forms ์•„ํ‚คํ…์ฒ˜๋ฅผ ์žฌ๊ตฌ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„.

์ด๊ฒƒ์€ ์ฃผ์ œ์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚˜์ง€๋งŒ ์ด ์ •ํ™•ํ•œ ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌป๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

SKCanvasView (๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Skia)์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ๊ฐ์€ ํ•ญ์ƒ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ํ•ญ๋ชฉ๊ณผ ๊ฒน์น˜๋ฉด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ๊ทธ๋ผ๋””์–ธํŠธ ์ปจํŠธ๋กค(Skia๋กœ ์ž‘์„ฑ๋œ ๋ Œ๋”๋Ÿฌ)์ด ์žˆ๊ณ  ๊ทธ ์œ„์— ๋ฐ˜ํˆฌ๋ช… ๋ฒ„ํŠผ(Skia๋กœ ์ž‘์„ฑ๋œ ๋ Œ๋”๋Ÿฌ)์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‘ ๋ฐฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ž˜ํ”ฝ ์ปจํ…์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ๊ณต์œ ๋ฉ๋‹ˆ๊นŒ? Skia ์ปจํŠธ๋กค์ด Skia ์ด์™ธ์˜ ์ปจํŠธ๋กค๊ณผ ๊ฒน์น˜๋ฉด ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ด์ „์— Skia๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Forms์—์„œ ๋ฉ‹์ง„ ๊ทธ๋ž˜ํ”ฝ ์ปจํŠธ๋กค์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฑฑ์ •๊ฑฐ๋ฆฌ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@GalaxiaGuy wpf ์ปจํŠธ๋กค์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” winform ์ปจํŠธ๋กค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ‚ค์–ด ์ปจํŠธ๋กค์ด ์•„๋‹Œ ์ปจํŠธ๋กค์—์„œ ๊ฒน์นœ ์Šคํ‚ค์–ด ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์„ ์€ ์•„๋‹™๋‹ˆ๋‹ค.
SKCanvasView ๋ Œ๋”๋ง๋œ ๋‘ ๊ฐœ์˜ ์ปจํŠธ๋กค์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋ž˜ํ”ฝ ์ปจํ…์ŠคํŠธ๋Š” ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ Œ๋”๋ง๋œ ๋‘ ๊ฐœ๋ฅผ ํ•ฉ์„ฑํ•˜์—ฌ ๋‹จ์ผ ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚ด ํ…Œ์ŠคํŠธ์—์„œ SkiaSharp ์„ฑ๋Šฅ์€ ์ •์  ์ž‘์—…๋งŒ ํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๊ฐ€์ง€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‚ด ๋žฉํ†ฑ์—์„œ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์•ฝ๊ฐ„ ๋†’์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Skia์— ์—ด๊ด‘ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ข‹์€ ๋ Œ๋”๋ง ์‚ฌ์–‘์€ ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ Œ๋”๋ง ์—”์ง„๊ณผ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ๊ฐ€ Skia(๋˜๋Š” Direct2D ๋˜๋Š” OpenGL ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ณ„์ธต์—์„œ ๊ฑฑ์ •ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ช‡ ๋…„ ์ „ WPF๋ฅผ ์‚ฌ์šฉํ•œ XAML์˜ ๊ฐ€์žฅ ํฐ ์•ฝ์†์€ Lookless Controls ์˜ ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค. Xamarin Forms๋Š” ์ด ๊ธฐ๋Šฅ ์—†์ด XAML์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ทจ์•ฝํ•œ ์ง€์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ํ›„ Drawing ์‚ฌ์–‘์œผ๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์–‘ํ•œ OS ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ์ถ”์ƒํ™” ์ง‘ํ•ฉ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ํ”Œ๋žซํผ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ์‹œ๊ฐ์  ๊ธฐ๋ณธ ์š”์†Œ ๋ฐ ํ”Œ๋žซํผ๋ณ„ ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง ๋ฐฑ์—”๋“œ๋กœ ํ…œํ”Œ๋ฆฟ ํ™” ๋œ XAML ๊ธฐ๋ฐ˜์˜ ์ง„์ •์œผ๋กœ

๋ช‡ ๋…„ ์ „ WPF๋ฅผ ์‚ฌ์šฉํ•œ XAML์˜ ๊ฐ€์žฅ ํฐ ์•ฝ์†์€ ์ปจํŠธ๋กค์˜ ์‹ค์ œ ๊ทธ๋ž˜ํ”ฝ์ด ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์—ฐ๊ธฐ๋˜๋Š” Lookless Controls์˜ ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค. Xamarin Forms๋Š” ์ด ๊ธฐ๋Šฅ ์—†์ด XAML์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ทจ์•ฝํ•œ ์ง€์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ํ›„ Drawing ์‚ฌ์–‘์œผ๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์˜! ๊ทธ๋ฆฌ๊ณ  ์•ฑ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์˜ 99%๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด ์ •๋ง ์ ์€ ์ˆ˜์˜ ๋ Œ๋”๋ง ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ…Œ๋‘๋ฆฌ(๊ทธ๋ฆผ์ž ๋ฐ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ ์˜ต์…˜ ํฌํ•จ)
  • ์„ /ํƒ€์›/์‚ฌ๊ฐํ˜•
  • ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋ Œ๋”๋ง
  • ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ž…๋ ฅ
  • ์„œ์‹ ์žˆ๋Š” ํ…์ŠคํŠธ ๋ Œ๋”๋ง
  • ์„œ์‹ ์žˆ๋Š” ํ…์ŠคํŠธ ์ž…๋ ฅ
  • HTML ๋ Œ๋”๋ง
  • ์ด๋ฏธ์ง€ ๋ฐœํ‘œ์ž
  • ์˜ค๋””์˜ค/๋น„๋””์˜ค ๋ฐœํ‘œ์ž
  • ๋‹จ์ƒ‰ ๋ฐ ์„ ํ˜•/๋ฐฉ์‚ฌํ˜• ๊ทธ๋ผ๋ฐ์ด์…˜ ๋ธŒ๋Ÿฌ์‹œ

XF ๋ Œ๋”๋ง ํ”Œ๋žซํผ์€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ์ปจํŠธ๋กค์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์˜ ๊ธฐ์กด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋นŒ๋“œํ•˜๋Š” ๋Œ€์‹  ์ƒˆ ๋ Œ๋”๋Ÿฌ๋กœ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋น„๋Œ€ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ํ›จ์”ฌ ๋” ๋งŽ์€ ๋…ผ๋ฆฌ๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ ๊ณ„์ธต์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋ฉฐ, ํ•ญ๋ชฉ ์ œ์–ด์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฐ€์žฅ ์–ด๋ ค์šด ์ ์ž…๋‹ˆ๋‹ค( VirtualizingStackPanel ๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ ๋ทฐ์–ด๋ฅผ ๊ฐ–๋Š” ๋ฐ ์ค‘์š”ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์™ธ๋ถ€๋กœ ํšจ๊ณผ์ ์œผ๋กœ ์ด์‹๋œ ์ ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. WPF๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ๊ทธ๋Ÿฌ๋‚˜ WPF๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฒƒ๋“ค์ด ์ง€๊ธˆ MAUI๋กœ ํฌํŒ…๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งˆ์นจ๋‚ด ์ด๊ฒƒ์ด ์ผ์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•  ๋•Œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ฑ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์˜ ์•„๋งˆ 99%๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด ์•„์ฃผ ์ ์€ ์ˆ˜์˜ ๋ Œ๋”๋ง ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Uno ํ”Œ๋žซํผ์€ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@velocitysystems

๊ณต์œ  ์ปจํŠธ๋กค์— ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ  PropertyChanged ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋Œ€์‹  ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ์—์„œ ์†์„ฑ์„ ์ง์ ‘ ๋งคํ•‘ํ•˜๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ์ด๋ฒˆ ๋ณ€ํ™”์˜ ํฐ ๋ชฉํ‘œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋ฐ˜๋Œ€ํŽธ์— ์žˆ์œผ๋ฉด ๋ Œ๋”๋Ÿฌ๋Š” BindableObject ๋˜๋Š” INPC๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ด๋ฒˆ ๋ณ€ํ™”์˜ ํฐ ๋ชฉํ‘œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋ฐ˜๋Œ€ํŽธ์— ์žˆ์œผ๋ฉด ๋ Œ๋”๋Ÿฌ๋Š” BindableObject ๋˜๋Š” INPC๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋ Œ๋”๋Ÿฌ์˜ ๋ฐฉ๋ฒ•์€ ๋•Œ๋งˆ๋‹ค ํ”„๋ ˆ์ž„ ์›Œํฌ์— ์˜ํ•ด ํ˜ธ์ถœ ์–ป์„ ๊ฒƒ์ด๋‹ค ๊ทธ๋ž˜์„œ BindableProperty ๊ฐ’ ๋Œ€์‹ ์— ๊ฐ€์ž…ํ•ด์•ผํ•˜๋Š” ๋ Œ๋”๋Ÿฌ์˜ ๋ณ€๊ฒฝ PropertyChanged ?

@legistek ๋งž์•„

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ข…์†์„ฑ์„ ๋ฐ˜์ „์‹œํ‚ต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ Œ๋”๋Ÿฌ๋Š” IButton์— ๋Œ€ํ•ด์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ System.Maui๋Š” ๋ Œ๋”๋Ÿฌ๊ฐ€ Xamarin.Forms.Core์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ–๋Š” ๋ฐฉ์‹๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์žˆ๋Š” ์ŠคํŒŒ์ดํฌ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค
https://github.com/dotnet/maui/pull/66

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์ €๋Š” ์˜ค๋Š˜ ์˜คํ›„ 3์‹œ 30๋ถ„ PDT ์‹œ๊ฐ„์— @davidortinau ์™€ ํ•จ๊ป˜

https://www.twitch.tv/microsoftdeveloper

์šฐ๋ฆฌ์™€ ํ•จ๊ป˜! ํ™•์ธ ํ•ด๋ด! ๊ทธ๋ฆฌ๊ณ  ์งˆ๋ฌธํ•˜์„ธ์š”!

@PureWeen ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋†“์ณค๋‹ค. YouTube์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋…น์Œ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ์ด๋ฒˆ ๋ณ€ํ™”์˜ ํฐ ๋ชฉํ‘œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์˜ ๋ฐ˜๋Œ€ํŽธ์— ์žˆ์œผ๋ฉด ๋ Œ๋”๋Ÿฌ๋Š” BindableObject ๋˜๋Š” INPC๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ฑฐ๋Œ€ํ•˜๊ณ  ์‹ค์งˆ์ ์ธ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ์˜์‹ฌํ•  ์—ฌ์ง€ ์—†์ด ๋งˆ์šฐ์ด๋กœ์˜ ์ด๋™๊ณผ ํ•จ๊ป˜ ๋งŽ์€ ๋ Œ๋”๋Ÿฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณต์žกํ•œ ์ƒ์† ๋ชจ๋ธ์ด ์ œ๊ฑฐ๋˜์–ด ๋ณด๋‹ค ๊ตฌ์„ฑ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ #66์„ ๋ฆฌ๋ทฐํ•ฉ๋‹ˆ๋‹ค.

#66์„ ๋ณด๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  'bait-and-switch'๋กœ ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋นŒ๋“œ๋˜๊ณ  ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ:

  • Slim ๋ Œ๋”๋Ÿฌ๊ฐ€ GC ๋ฌธ์ œ, ํŠนํžˆ ๊ด€๋ฆฌ ๋ฐ ๊ธฐ๋ณธ ์ œ์–ด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” Android์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ObjectDisposedException ์ด์–ด์ง€๋Š” ๊ฐ€์ƒํ™”๋œ ๋ ˆ์ด์•„์›ƒ์˜ ์ž์‹ ๋ณด๊ธฐ์—์„œ ํŠนํžˆ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.
  • Slim ๋ Œ๋”๋Ÿฌ๊ฐ€ Effect ์˜ ์‚ฌ์šฉ ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๊นŒ? ํšจ๊ณผ๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ๋ณต์žก์„ฑ๊ณผ ๋Œ€๊ธฐ ์‹œ๊ฐ„์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • '์–‘๋ฐฉํ–ฅ' ์†์„ฑ์€ ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ ๋””์ž์ธ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด MediaElement ์— Position( TimeSpan ) ์†์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Setter๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  getter๋Š” ๊ธฐ๋ณธ ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด(์˜ˆ: AVPlayer , MediaPlayer ์—์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ๋กœ _getter_๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Slim ๋ Œ๋”๋Ÿฌ๊ฐ€ GC ๋ฌธ์ œ, ํŠนํžˆ ๊ด€๋ฆฌ ๋ฐ ๊ธฐ๋ณธ ์ œ์–ด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” Android์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋‘๋ ค์šด ObjectDisposedException์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ฐ€์ƒํ™”๋œ ๋ ˆ์ด์•„์›ƒ์˜ ์ž์‹ ๋ณด๊ธฐ์—์„œ ํŠนํžˆ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!! ์šฐ๋ฆฌ๋Š” ODE ์˜ˆ์™ธ์˜ ์ „๋ถ€๋Š” ์•„๋‹์ง€๋ผ๋„ ๋Œ€๋ถ€๋ถ„์„ ํฌ๋ง์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ๊ธฐ ์ „๋žต์„ ์•ฝ๊ฐ„ ์žฌ์ž‘์—…ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” Android/iOS์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋งค์šฐ ์ ๊ทน์ ์œผ๋กœ ํ๊ธฐํ•˜์ง€๋งŒ GC๊ฐ€ ํ•˜๋Š” ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด GC์— ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์—ญ์ฐธ์กฐํ•˜๊ณ  GC๊ฐ€ ์ด๋Ÿฌํ•œ ๋งŽ์€ ๊ฒฝ์šฐ์— ๋„์›€์ด ๋˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋ฉด

Slim ๋ Œ๋”๋Ÿฌ๋Š” Effect์˜ ์‚ฌ์šฉ ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๊นŒ? ํšจ๊ณผ๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ๋ณต์žก์„ฑ๊ณผ ๋Œ€๊ธฐ ์‹œ๊ฐ„์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด ์•„์ด๋””์–ด๋ฅผ ๋ฐœ์ „์‹œํ‚ฌ ๋•Œ ์‚ดํŽด๋ด์•ผ ํ•  ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ์ตœ์ข… ๋””์ž์ธ์— ๋„๋‹ฌํ•˜๋ฉด ํšจ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, ํšจ๊ณผ๊ฐ€ ์ „์ฒด ๋ Œ๋”๋Ÿฌ๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜๋„๋œ ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งคํผ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์“ธ๋ชจ์—†๋Š” ํšจ๊ณผ

'์–‘๋ฐฉํ–ฅ' ์†์„ฑ์€ ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ ๋””์ž์ธ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์น˜(TimeSpan) ์†์„ฑ์ด ์žˆ๋Š” MediaElement๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Setter๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  getter๋Š” ๊ธฐ๋ณธ ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด(์˜ˆ: AVPlayer, MediaPlayer)์—์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ๋กœ ๊ฒŒํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์•„์ง ์ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @Clancey๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ActionMapper๋Š” ์ด์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ? https://github.com/dotnet/maui/blob/slim-renderers/Maui.Core/PropertyMapper.cs#L91

'์–‘๋ฐฉํ–ฅ' ์†์„ฑ์€ ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ ๋””์ž์ธ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์น˜(TimeSpan) ์†์„ฑ์ด ์žˆ๋Š” MediaElement๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Setter๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  getter๋Š” ๊ธฐ๋ณธ ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด(์˜ˆ: AVPlayer, MediaPlayer)์—์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ๋กœ ๊ฒŒํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์•„์ง ์ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @Clancey๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ActionMapper๋Š” ์ด์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ? https://github.com/dotnet/maui/blob/slim-renderers/Maui.Core/PropertyMapper.cs#L91

์ •ํ™•ํžˆ. ๋”ฐ๋ผ์„œ ActionMapper๋Š” SetElement ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  PropertyMapper์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ WebView, GoBack๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ. ์ดˆ๊ธฐํ™” ์ค‘์— ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ Œ๋”๋Ÿฌ์™€ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์—”ํŠธ๋ฆฌ. ํ…์ŠคํŠธ ๊ฐ’์ด ํ•ญ๋ชฉ์— ์žˆ์„ ๋•Œ. IEntry์—๋Š” string Text {get;set;} ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏธ๋””์–ด ์š”์†Œ์˜ ๊ฒฝ์šฐ 2๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋‹จ์ˆœํžˆ ์œ„์น˜/์‹œ๊ฐ„์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค์‹œ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋Œ€์‹  ์ฟผ๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด. ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. xplat ๋ณด๊ธฐ๋Š” ๋ Œ๋”๋Ÿฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. view.Renderer.NativeView as NativeMediaView ์ด์ œ ์›ํ•˜๋Š” ์†์„ฑ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๋‹ค์Œ์€ ๋นŒ๋“œ ์ค‘ ์ŠคํŠธ๋ฆผ์˜ ์ผ๋ถ€ ๋น„๋””์˜ค์ž…๋‹ˆ๋‹ค.

@Clancey ๋Š” ์—ฌ๊ธฐ์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
https://www.youtube.com/watch?v=_MGh3xipWm4

๋‚˜๋Š” David์™€ ํ•จ๊ป˜ ์—ฌ๊ธฐ์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ์•ฝ๊ฐ„ ๋งŒ์ง„๋‹ค.
https://www.youtube.com/watch?v=lAmwjfZY1IM

'์–‘๋ฐฉํ–ฅ' ์†์„ฑ์€ ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ ๋””์ž์ธ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์น˜(TimeSpan) ์†์„ฑ์ด ์žˆ๋Š” MediaElement๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Setter๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  getter๋Š” ๊ธฐ๋ณธ ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด(์˜ˆ: AVPlayer, MediaPlayer)์—์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ๋กœ ๊ฒŒํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์•„์ง ์ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @Clancey๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ActionMapper๋Š” ์ด์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ? https://github.com/dotnet/maui/blob/slim-renderers/Maui.Core/PropertyMapper.cs#L91

์ •ํ™•ํžˆ. ๋”ฐ๋ผ์„œ ActionMapper๋Š” SetElement ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  PropertyMapper์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ WebView, GoBack๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ. ์ดˆ๊ธฐํ™” ์ค‘์— ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ Œ๋”๋Ÿฌ์™€ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์—”ํŠธ๋ฆฌ. ํ…์ŠคํŠธ ๊ฐ’์ด ํ•ญ๋ชฉ์— ์žˆ์„ ๋•Œ. IEntry์—๋Š” string Text {get;set;} ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏธ๋””์–ด ์š”์†Œ์˜ ๊ฒฝ์šฐ 2๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋‹จ์ˆœํžˆ ์œ„์น˜/์‹œ๊ฐ„์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค์‹œ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋Œ€์‹  ์ฟผ๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด. ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. xplat ๋ณด๊ธฐ๋Š” ๋ Œ๋”๋Ÿฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. view.Renderer.NativeView as NativeMediaView ์ด์ œ ์›ํ•˜๋Š” ์†์„ฑ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์—ฌ๊ธฐ์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ์€ C#9์—์„œ ์ œ๊ณต๋˜๋Š” ๋ ˆ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํŠน์ˆ˜์„ฑ์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ init ์†์„ฑ ์ ‘๊ทผ์ž๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด ๋งคํผ๊ฐ€ with ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ทฐ๊ฐ€ ๋ ˆ์ฝ”๋“œ์— ๋ฐ”์ธ๋”ฉ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ˆœ์ˆ˜ MVVM ๋˜๋Š” ์ˆœ์ˆ˜ MVU์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ์‰ฌ์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์งˆ๋ฌธ: ๊ท€ํ•˜๊ฐ€ ๊ฒŒ์‹œํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์—๋Š” Windows.UI.* ์˜ํ•ด ๋ Œ๋”๋ง๋˜๋Š” Windows ์ปจํŠธ๋กค์ด ์žˆ์ง€๋งŒ ์ œ๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์ด๋Š” ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ฐฝํ•œ ๋””์ž์ธ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐœ์„  ์‚ฌํ•ญ์€ WinUI ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋กœ Microsoft.UI.* ์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋„ค์ดํ‹ฐ๋ธŒ ์ปจํŠธ๋กค์— ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์€ ํฐ ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Xamarin.Forms์˜ ๋”์ฐํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋…ํŠนํ•˜๊ณ  ์•„๋ฆ„๋‹ค์šด ๋ ˆ์ด์•„์›ƒ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ์–‘ ์—†์ด WPF ๋ฐ Flutter ์ปจํŠธ๋กค์˜ ๊ฐœ๋…๊ณผ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋”ฐ๋ผ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. OpenGL / DirectX / Metal์„ ์‚ฌ์šฉํ•˜์—ฌ C ++๋กœ ์ž‘์„ฑ๋œ ์—”์ง„์€ ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํ”Œ๋žซํผ ๊ตฌ์กฐ์— ์˜์กดํ•˜์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์‹์„ฑ, ์„ฑ๋Šฅ ๋ฐ ์œ ์—ฐ์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜/์†์„ฑ ๋งคํผ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งคํ•‘ ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ์œ„ํ•œ ์Šฌ๋ฆผ ๋ Œ๋” ์•„ํ‚คํ…์ฒ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ฆฐ ์ปจํŠธ๋กค ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ ˆ๋Œ€ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋Œ€ ๋น„๋„ค์ดํ‹ฐ๋ธŒ ์ปจํŠธ๋กค์„ ํ˜ผํ•ฉํ•˜์—ฌ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๊ทธ๋ ค์ง€๋ฉด ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋“œ๋กœ์ž‰ ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ ๋™์ผํ•œ ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋”ฐ๋ฅด๋Š” Skia ๊ธฐ๋ฐ˜ ์ปจํŠธ๋กค์— ๋Œ€ํ•œ ์ž‘์—…์„ ๊ณ„์†ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. https://github.com/Clancey/Comet/tree/dev/src/Comet.Skia/Handlers.

์ด ๋ Œ๋”๋Ÿฌ์— ๋Œ€ํ•œ ๋‚˜์˜ 2ยข(๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค, TBH):

๋™์ผํ•œ ์ปจํŠธ๋กค ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋žซํผ์—์„œ ๋ Œ๋”๋ง๋œ ์ปจํŠธ๋กค(์˜ˆ: UIButton ๋ž˜ํ•‘)๊ณผ ๊ฒ‰๋ณด๊ธฐ ์—†๋Š” ์ปจํŠธ๋กค(WPF๋กœ ํ‘œ์‹œ)์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Maui Button ํด๋ž˜์Šค๊ฐ€ ์ปจํŠธ๋กค ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ํ”Œ๋žซํผ๋ณ„ ๋ Œ๋”๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ButtonRenderer๊ฐ€ ํฌํ•จ๋œ Button์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ButtonRenderer๋Š” ๊ฐ UI ํˆดํ‚ท์— ๋Œ€ํ•œ ํ”Œ๋žซํผ๋ณ„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cocoa/UIKit/UWP/etc์™€ ํ†ต์‹ ํ•˜๊ณ  ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Button ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ์†์„ฑ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทธ๋ฆฐ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ WPF์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ButtonRenderer ๋Œ€์‹  ํ…œํ”Œ๋ฆฟ์„ ์žฌ์ •์˜ํ•˜๊ณ  ๋“œ๋กœ์ž‰ ํด๋ž˜์Šค(์–ด๋–ค ๋ชจ์–‘์ด๋“ ์ง€ ๊ฐ„์—)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WPF๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋งŒํผ Xamarin.Forms๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋“ค์ด์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์˜ค๋Š˜๋‚  ๋งˆ์šฐ์ด์—์„œ ์ด๋ฏธ ๊ฐ€๋Šฅํ•œ์ง€(๋˜๋Š” ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ์ง€) ์†”์งํžˆ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋„ค๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ด์ค˜!

์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋‹ค๋ฅธ ์•ฑ ๋ชจ๋ธ(MVVM, MVU ๋“ฑ)์— ๋Œ€ํ•ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์•ฑ ๋ชจ๋ธ์— ์ž์ฒด ๋ Œ๋”๋Ÿฌ ์„ธํŠธ๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ ค ์ฃผ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ œ ์ƒ๊ฐ์—๋Š” ๋ Œ๋”๋ง ์œ ํ˜•(์˜ˆ: XF์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์ปจํŠธ๋กค์œผ๋กœ ๋ Œ๋”๋ง, ์บ”๋ฒ„์Šค๋กœ ๋ Œ๋”๋ง ๋“ฑ)๋‹น ํ•˜๋‚˜์˜ ๋ Œ๋”๋Ÿฌ ์„ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋ Œ๋”๋Ÿฌ๋Š” ์•ฑ ๋ชจ๋ธ์„ ์ธ์‹ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๊ธฐ๋ณธ ์ปจํŠธ๋กค์— ์˜ฌ๋ฐ”๋ฅธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์–ด๋–ค ๊ฐ’์ด ์–ด๋–ค ์†์„ฑ์— ๋งคํ•‘๋˜๋Š”์ง€๋งŒ ์•Œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
IButton ๊ฐ ์•ฑ ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜๋ฉฐ ํ•ด๋‹น ๋ Œ๋”๋Ÿฌ์˜ ๋งคํ•‘๋œ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Fabulous์™€ ๊ฐ™์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๊ฐ ํ”Œ๋žซํผ์˜ ๊ฐ ์ปจํŠธ๋กค์— ๋Œ€ํ•œ ๋ชจ๋“  ์ ์ ˆํ•œ ๋ Œ๋”๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”(๋ชจ๋“  ๋ฒ„๊ทธ์™€ ํ•จ๊ป˜) Microsoft์˜ ์ธ๋ ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์š”์ ์€ ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค( IButton )๊ฐ€ ๋ Œ๋”๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด getter ์ „์šฉ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ Œ๋”๋Ÿฌ๋Š” ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ ์•ฑ ๋ชจ๋ธ์€ ์ปจํŠธ๋กค์„ ๋‹ค๋ฅด๊ฒŒ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค(BindableProperty, BindingObject ๋“ฑ).
์˜ˆ๋ฅผ ๋“ค์–ด Fabulous๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ทฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ IButton ์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ˜•์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์‹์œผ๋กœ Fabulous๋Š” IButton ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚ด๋ถ€ ์‚ฌ์ „์„ ํ†ตํ•ด ๋…์ž ๋ณด๊ธฐ๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// This is the type used by our users, sort of a Builder that return a new instance each time
// and append the set value to an internal list 
public struct Button
{
     public Button Text(string value) => (...);

     internal ReadOnlyDictionary<string, obj> Build() { ... }
}

// This will be an implementation of IButton, hidden from our users
internal class FabulousButton : IButton
{
    private ReadOnlyDictionary<string, obj> _properties;
    FabulousButton(ReadOnlyDictionary<string, obj> properties)
    {
        _properties = properties;
    }

    void Update(ReadOnlyDictionary<string, obj> properties)
    {
        var previousProperties = _properties;
        _properties = properties;

        // Diffing of the 2 dictionaries to determine what changed
        // and which mapped functions inside the renderer should be called
        (...)
    }

    public string Text => _properties["Text"];
}

@TimLariviere ๋‹น์‹ ์ด ๋งํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค :-)

๊ฑฐ๊ธฐ์— ์žˆ๋Š” ๊ทธ๋ฆผ์€ ๋ Œ๋”๋Ÿฌ๋งŒํผ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์—์„œ ๋‹น์‹ ์ด ๊ฑฑ์ •ํ•ด์•ผ ํ•  ์œ ์ผํ•œ ๋ถ€๋ถ„์€ Fabulous Button์ด๊ณ  ๊ฑฐ๊ธฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์ด ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
https://github.com/dotnet/maui/blob/slim-renderer-samples/Maui.Core/Views/IText.cs

(๋ Œ๋”๋Ÿฌ์— ๊ด€ํ•œ ํ•œ) ์‹ค์ œ๋กœ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ๋Š” ๊ฒƒ์€ IButton์„ ๋‹ค์‹œ ์†Œ๋น„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ Œ๋”๋Ÿฌ์— ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ๋ชจ๋“  ๊ฒƒ์˜ BindableObject ๋ฒ„์ „์—์„œ ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์—์„œ Renderer์˜ updateproperty ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/dotnet/maui/blob/slim-renderer-samples/System.Maui.Core/VisualElement.cs#L1132

(๊ณง?) @Clancey ๋Š” Comet์˜ ๊ณต๊ฐœ ๋ฒ„์ „์„ ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฒดํฌ ์•„์›ƒ ํ•  ๊ฒƒ์ด๋‹ค
https://github.com/dotnet/maui/blob/slim-renderer-samples

์—ฌ๊ธฐ์— Fabulous.Core ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„ ์ถ”๊ฐ€๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@PureWeen ์˜ค

@PureWeen @Clancey ๋งˆ์šฐ์ด ํŒ€์ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด Slim ๋ Œ๋”๋Ÿฌ๋Š” ์ƒ์†๋ณด๋‹ค ๊ตฌ์„ฑ์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์†์€ ์œ ์šฉํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ XF์—์„œ๋Š” ์ผ๋ถ€ ๋ Œ๋”๋Ÿฌ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

@PureWeen
์ด URL
https://github.com/dotnet/maui/blob/slim-renderer-samples

404๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ์ž…๋‹ˆ๊นŒ?

@๋žœ๋ค

https://github.com/dotnet/maui/tree/slim-renderer-samples

@velocitysystems

๋‚˜๋Š” Maui ํŒ€์ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด Slim ๋ Œ๋”๋Ÿฌ๋Š” ์ƒ์†๋ณด๋‹ค ๊ตฌ์„ฑ์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์†์€ ์œ ์šฉํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ XF์—์„œ๋Š” ์ผ๋ถ€ ๋ Œ๋”๋Ÿฌ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๊ทธ๋“ค์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. System.Object ์—์„œ ์ง์ ‘ ์ƒ์†ํ•˜๋Š” ๋งค์šฐ ์–‡์€ ๊ธฐ๋ณธ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/dotnet/maui/blob/slim-renderer-samples/Maui.Core/Renderers/View/AbstractViewRenderer.Android.cs

๊ทธ๋ฆฌ๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ์ธ๋งฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์—์„œ ๋ชจ๋“  ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์ „์„ ํ†ตํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

https://github.com/dotnet/maui/blob/slim-renderer-samples/Maui.Core/Renderers/View/AbstractViewRenderer.cs#L31

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋งคํผ๋กœ ๋งคํผ๋ฅผ ์žฅ์‹ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž์‹ ์˜ func ๋“ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค์˜ 95%๊ฐ€ ๋งคํผ์— ๊ณ ์œ ํ•œ Func๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‘ ๋‹ค์ค‘ ๋Œ€์ƒ์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์š”์†Œ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

@PureWeen ์ƒ˜ํ”Œ์—์„œ ์ด๋Ÿฌํ•œ ์Šฌ๋ฆผ ๋ Œ๋”๋Ÿฌ์˜ ๊ตฌํ˜„์„ ๋…ผ์˜ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ ์ ˆํ•œ ์ฑ„๋„์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’์€ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๊นŒ? XF์—์„œ๋Š” ํ˜„์žฌ BindableProperty ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ •์˜๋˜์ง€๋งŒ ์•ฑ ๋ชจ๋ธ์— ๋”ฐ๋ผ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Application ํด๋ž˜์Šค๋„ (๋ถ€๋ถ„์ ์œผ๋กœ) ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฉ๋‹ˆ๊นŒ? ๋งŽ์€ UI ๋™์ž‘(๋ฆฌ์†Œ์Šค, ๋ฉ”๋‰ด, ๋ฉ”์ธ ํŽ˜์ด์ง€)์„ ์ •์˜ํ•˜๊ณ  ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์ธก์ •/์ •๋ ฌ/๋“ฑ์ด ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ถ”์ถœ๋ฉ๋‹ˆ๊นŒ? ์•ฑ ๋ชจ๋ธ์ด ์ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๊นŒ? XF์—์„œ๋Š” ํ˜„์žฌ BindableProperty ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ •์˜๋˜์ง€๋งŒ ์•ฑ ๋ชจ๋ธ์— ๋”ฐ๋ผ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. @ํด๋žœ์‹œ ? ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์•„์ง ์ •์˜ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งคํผ๊ฐ€ ์†์„ฑ์˜ ํ˜„์žฌ ๊ฐ’(๊ธฐ๋ณธ๊ฐ’)์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์ดˆ๊ธฐ ์„ค์ • ๋‹จ๊ณ„๊ฐ€ ์žˆ์ง€๋งŒ ์•„์ง ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์ผ๋ฐ˜ํ™”ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Application ํด๋ž˜์Šค๋„ (๋ถ€๋ถ„์ ์œผ๋กœ) ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฉ๋‹ˆ๊นŒ? ๋งŽ์€ UI ๋™์ž‘(๋ฆฌ์†Œ์Šค, ๋ฉ”๋‰ด, ๋ฉ”์ธ ํŽ˜์ด์ง€)์„ ์ •์˜ํ•˜๊ณ  ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ! ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค(๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ xplat)๋ฅผ ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค๋กœ ์ถ•์†Œํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ ์™œ ๋ฌผ์–ด๋ณด๋Š”๊ฑฐ์•ผ? ๊ท€ํ•˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ธก์ •/์ •๋ ฌ/๋“ฑ์ด ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ถ”์ถœ๋ฉ๋‹ˆ๊นŒ? ์•ฑ ๋ชจ๋ธ์ด ์ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ๊ทธ๊ฒƒ์ด ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋ชจ๋“  ๋ ˆ์ด์•„์›ƒ ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜์—ฌ BindableObject/Property์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ Blazor/Comet/other๋Š” StackLayout์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑธ ์™œ ๋ฌผ์–ด๋ณด๋Š”๊ฑฐ์•ผ? ๊ท€ํ•˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์›ํ•˜๋Š”์ง€ ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Fabulous์—์„œ๋Š” ํ˜„์žฌ ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ๊ณผ ๋ฉ”์ธ ๋ฉ”๋‰ด(macOS์™€ ๊ฐ™์€)๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์ข‹์€ ์Šคํ† ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ Application ํด๋ž˜์Šค๋ฅผ ์Šค์Šค๋กœ ์„œ๋ธŒํด๋ž˜์Šคํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์‹ Xamarin.Forms์—์„œ์™€ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค/๋ฉ”๋‰ด๋ฅผ ์ •์˜ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด์ƒ์ ์œผ๋กœ๋Š” Application์˜ ๋ชจ๋“  UI ๊ด€๋ จ ์†์„ฑ๋„ ๋ณด๊ธฐ์˜ ์ผ๋ถ€๊ฐ€ ๋˜๋ฏ€๋กœ ๋ณด๊ธฐ ๊ตฌ๋ถ„ ๋…ผ๋ฆฌ๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๊ฒƒ

public interface IAppRoot
{
    IEnumerable<object> Resources { get; }
    IMenu MainMenu { get; }
    IPage MainPage { get; }
}

public class Application
{
    /// Bootstrapping and other logic of MAUI

   public IAppRoot Root { get; set; } // Replaces MainPage, which is typed for pages only
}

@PureWeen ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ: TextChanged , Toggled ๋“ฑ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ฑ…์ž„์€ ๋ˆ„๊ตฌ์—๊ฒŒ ์žˆ์Šต๋‹ˆ๊นŒ? ์ปจํŠธ๋กค ๋˜๋Š” ๋ Œ๋”๋Ÿฌ?

๋‹ค๋ฅธ ์•ฑ ๋ชจ๋ธ์˜ ๊ตฌํ˜„์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ๋ณ€๊ฒฝ์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ผ ๋•Œ ์ƒํƒœ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค๋Š˜ TextChanged on Entry๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ธ ๋•Œ๋‚˜ MyEntry.Text = "New value"; ํ•  ๋•Œ ๋ชจ๋‘ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ๋ณ€๊ฒฝ์— ๋ฐ˜์‘ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ถ”๋ก ํ•˜๋Š” ๋ฐ ์ข‹์ง€ ์•Š์€ ์•”์‹œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ”Œ๋žซํผ์ด ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  Fabulous๊ฐ€ ๋Œ์•„์˜ฌ ๊ฐ€๋Šฅ์„ฑ ์—†์ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋„๋ก ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— Android์—์„œ ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ฐพ์€ ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋… ์ทจ์†Œํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๊ถ๊ธˆํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. MAUI๊ฐ€ ์•„ํ‚คํ…์ฒ˜์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ปจํŠธ๋กค ์ด๋ฆ„์ด ์•„ํ‚คํ…์ฒ˜ ์ด๋ฆ„์œผ๋กœ ์ง€์ •๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—๋Š” Maui๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Mvvm .ButtonRenderer.Android? @PureWeen @Clancey

XF์—๋Š” Compressed Layouts(๋ฒ„๊ทธ๊ฐ€ ์žˆ์Œ)๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
MAUI์— ๋ฒ„๊ทธ๊ฐ€ ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์Šค๋ ˆ๋“œ์—์„œ UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด Flutter/Skia ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š”์ง€ ๋ณด๊ณ  ๋Œ€๋ถ€๋ถ„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
MAUI๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ/๋น„๋„ค์ดํ‹ฐ๋ธŒ ์ปจํŠธ๋กค ๋ฐ ๋ Œ๋”๋ง์„ ์ž ์žฌ์ ์œผ๋กœ ์ง€์›ํ•˜๊ฒŒ ๋˜์–ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ UI๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ์ •์น˜์ ์ธ ์ธก๋ฉด์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•๋ณดํ•œ๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋„ค, ์ €๋Š” Apple์— ๋Œ€ํ•ด ์ง€์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋‰ด์Šค๋กœ ์ธํ•ด ์–ด๋–ค ์‹œ์ ์—์„œ Flutter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด '๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€/์ œํ•œ๋œ ๊ธฐ๋Šฅ์„ ์•…์šฉ'ํ•˜๊ฑฐ๋‚˜ 'Apple UI ์ง€์นจ์„ ๋”ฐ๋ฅด์ง€ ์•Š์Œ' ๋“ฑ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋”๋ผ๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด Flutter/Skia ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š”์ง€ ๋ณด๊ณ  ๋Œ€๋ถ€๋ถ„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
MAUI์—์„œ ์ž ์žฌ์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์ปจํŠธ๋กค ๋ฐ ๋ Œ๋”๋ง์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž ์ง€์ •์„ ์ง€์›ํ•˜๊ฒŒ ๋˜์–ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ UI๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ์ •์น˜์ ์ธ ์ธก๋ฉด์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•๋ณดํ•œ๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋„ค, ์ €๋Š” Apple์— ๋Œ€ํ•ด ์ง€์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋‰ด์Šค๋กœ ์ธํ•ด ์–ด๋–ค ์‹œ์ ์—์„œ Flutter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด '๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€/์ œํ•œ๋œ ๊ธฐ๋Šฅ์„ ์•…์šฉ'ํ•˜๊ฑฐ๋‚˜ 'Apple UI ์ง€์นจ์„ ๋”ฐ๋ฅด์ง€ ์•Š์Œ' ๋“ฑ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋”๋ผ๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

MAUI๊ฐ€ ์›น(์˜ˆ: Flitter)์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ WebView๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ๋Œ€๊ธฐ์—…์€ WebView๋ฅผ ํ†ตํ•ด์„œ๋งŒ AppStore์— ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— Apple์€ WebView ๊ธฐ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐํžˆ ์ฐจ๋‹จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด Flutter/Skia ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š”์ง€ ๋ณด๊ณ  ๋Œ€๋ถ€๋ถ„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
MAUI์—์„œ ์ž ์žฌ์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์ปจํŠธ๋กค ๋ฐ ๋ Œ๋”๋ง์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž ์ง€์ •์„ ์ง€์›ํ•˜๊ฒŒ ๋˜์–ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ UI๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ์ •์น˜์ ์ธ ์ธก๋ฉด์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•๋ณดํ•œ๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋„ค, ์ €๋Š” Apple์— ๋Œ€ํ•ด ์ง€์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋‰ด์Šค๋กœ ์ธํ•ด ์–ด๋–ค ์‹œ์ ์—์„œ Flutter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด '๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€/์ œํ•œ๋œ ๊ธฐ๋Šฅ์„ ์•…์šฉ'ํ•˜๊ฑฐ๋‚˜ 'Apple UI ์ง€์นจ์„ ๋”ฐ๋ฅด์ง€ ์•Š์Œ' ๋“ฑ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋”๋ผ๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

MAUI๊ฐ€ ์›น(์˜ˆ: Flitter)์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ WebView๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ๋Œ€๊ธฐ์—…์€ WebView๋ฅผ ํ†ตํ•ด์„œ๋งŒ AppStore์— ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— Apple์€ WebView ๊ธฐ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐํžˆ ์ฐจ๋‹จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ด๋ฏธ ์ง€์นจ์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค - https://developer.apple.com/app-store/review/guidelines/#minimum -functionity

MAUI์˜ ์ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์„ธ๊ณ„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฝ๊ณ  ๋„ค ๋ฒˆ์งธ๋กœ ์ฝ์€ ํ›„, ๊ฑฐ๋ฃฉํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‚ฌ๋ž‘์„ ์œ„ํ•ด ์‹ค์ œ๋กœ SKIA ๋˜๋Š” ๊ธฐํƒ€ ๋‹ค์ค‘ ํ”Œ๋žซํผ ๋ Œ๋”๋ง ์—”์ง„๊ณผ ๊ฐ™์€ ๋ Œ๋”๋ง ์—”์ง„์„ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Xamarin Forms์™€ ๊ฐ™์€ ๊ฐ ํ”Œ๋žซํผ์˜ UI๋Š” ๋งˆ์น˜ ์ง€์˜ฅ์˜ ์ผ๊ณฑ ๋ฒˆ์งธ ์„œํด์—์„œ ๋งŒ๋“  ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ์˜ค๋ž˜๋˜๊ณ  ์˜ค๋ž˜๋œ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ํ•„์ˆ˜์ธ ๊ฒฝ์šฐ ์ƒˆ๋กญ๊ณ  ํ˜„๋Œ€์ ์ธ ๋ Œ๋” ์ง€์›์„ ์ด์ „ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ "๊ทธ๋ƒฅ" ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ์ด์— ๋Œ€ํ•œ ๊น”๋”ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉํ•œ ๊ฒƒ์€ Unity์˜ UI ์—”์ง„์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ตœ์‹  UXML์—๋Š” IMGUI ๋ Œ๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@jackie0100
๋‚œ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค

Xamarin Forms์ฒ˜๋Ÿผ ๊ฐ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • UI๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ž˜๋˜๊ณ  ์ง€์˜ฅ์˜ ์ผ๊ณฑ ๋ฒˆ์งธ ์„œํด์—์„œ ๋งŒ๋“  ์†”๋ฃจ์…˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๋ Œ๋”๋Ÿฌ ๊ตฌํ˜„์— ๊ด€ํ•ด์„œ๋Š”, iView๋ฅผ์˜ ์•„์ด๋””์–ด์— ๋Œ€ํ•œ ์–ด๋–ค ๊ฒƒ์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ทฐ (๋Œ€์‹  iView๋ฅผ์˜ ๊ธฐ๋ณธ๋ณด๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค)์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌ์„ฑ ๋Œ€์‹  ์ƒ์†? ์ด๋Š” "์–‘์‹ ์˜ค๋ฒ„ํ—ค๋“œ"๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ์—†๋Š” ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ๊ฐ„๊ฒฐํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœ์ˆ˜ํ•œ ๊ธฐ๋ณธ ๋ณด๊ธฐ์™€ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ iOS ๋žœ๋“œ์—์„œ ๋ทฐ๋ฅผ UIView๋กœ ์บ์ŠคํŒ…ํ•˜๊ณ  IView๊ฐ€ UIView์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ž์‹(์›ํ•˜๋Š” ์œ ํ˜•์ด ๋ฌด์—‡์ด๋“ )์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, '๋„ค์ดํ‹ฐ๋ธŒ ์ž„๋ฒ ๋”ฉ'์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด IView๊ฐ€ UIView์ด๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ์Šต๋‹ˆ๋‹ค. IView ์ค‘ ํ•˜๋‚˜๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ทฐ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„ค์ดํ‹ฐ๋ธŒ <-> maui ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์ตœ๋Œ€ํ•œ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ๊ณผ ์ตœ์ € ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ํ”„๋กœํ† ํƒ€์ดํ•‘์„ ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋ถ„์ด ๋“ญ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ฃผ๋ง/์ €๋… ํ”„๋กœ์ ํŠธ...

image

MAUI๊ฐ€ ์›น(์˜ˆ: Flitter)์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ WebView๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

iOS์—์„œ๋Š” WebView๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. OpenGL ๋˜๋Š” Metal ์—์„œ ์ง์ ‘ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” OpenGL ๋˜๋Š” Metal๊ณผ ํ•จ๊ป˜ Skia๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋„ค์ดํ‹ฐ๋ธŒ UI๋กœ ์ž‘์—…ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์‚ฌ๋ฌผ์˜ ์ •์น˜์  ์ธก๋ฉด์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. [์‚ฌ๊ณผ]

์–ด๋Š ์‹œ์ ์—์„œ Apple์€ ์„œ๋ฉด ์ •์ฑ…์—์„œ ๊ธฐ๋ณธ UI ์œ„์ ฏ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ์ •์ฑ…์„ ๋‹ค์‹œ ์ œํ•œ์ ์œผ๋กœ ๋˜๋Œ๋ฆด ์‹ค์งˆ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ธฐ๋ณธ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜๋Š” _๊ฐ€๋Šฅ_ํ•œ ๊ฒƒ์€ ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

@legistek

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Skia์— ์—ด๊ด‘ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ข‹์€ ๋ Œ๋”๋ง ์‚ฌ์–‘์€ ๋ Œ๋”๋ง ์—”์ง„๊ณผ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค...

"๋ถˆ๊ด€๋ก "์ด๋ผ๋Š” ๊ฒƒ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ OpenGL/Metal/Vulkan/์ €์ˆ˜์ค€ ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ ์ง์ ‘ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€ํ™”ํ˜• UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์ด _๋งŽ์€_ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ Skia๊ฐ€ ์•ฑ์˜ UI ๋ฌธ์ œ์™€ ์‹ค์ œ ๋ Œ๋”๋ง ์—”์ง„ ์‚ฌ์ด์˜ ํšจ๊ณผ์ ์ธ _์ค‘๊ฐ„ ๊ณ„์ธต_์ด๊ธฐ ๋•Œ๋ฌธ์— Skia์— ์ง‘์ฐฉํ•ฉ๋‹ˆ๋‹ค. Skia๋Š” ๋ฒ ์–ด ๋ฉ”ํƒˆ๋งŒ ์žˆ๋‹ค๋ฉด ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์˜ _๋งŽ์€_์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘ํ’ˆ์„ ์žฌ๋ฐœ๋ช…ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. _only_ ๋Œ€์ƒ์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜์ง€๋งŒ ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๊ณ  ์„ฑ์ˆ™ํ•œ ๋Œ€์ƒ์ด๋ฏ€๋กœ OpenGL์—์„œ Vulkan์œผ๋กœ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Skia๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด Xamarin Forms์—์„œ ํ”Œ๋žซํผ ๊ฐ„ ์œ„์ ฏ๊ณผ ๊ธฐ๋ณธ ์œ„์ ฏ์ด๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๋ณ‘๋ ฌ ์œ„์ ฏ ๊ณ„์ธต์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ๋ฒˆ๊ฑฐ๋กญ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Skia๋Š” .Net Maui๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์—์„œ ๊ณ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•˜๋Š” ๋‚ ์„ ์•ž๋‹น๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ Œ๋”๋ง์˜ ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ๊ตฌ์ถ•ํ•˜๋Š” ๋Œ€์‹  ์ ์ ˆํ•œ ์ค‘๊ฐ„ ์ˆ˜์ค€ ์ถ”์ƒํ™”์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํฐ ์Šน๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์žŠ์ง€ ๋งˆ์„ธ์š”.
https://github.com/dotnet/maui/discussions/103

์ตœ๊ทผ ๋งˆ์šฐ์ด ๋น„๋””์˜ค๋ฅผ ๋ณธ ๊ฒฐ๊ณผ, ๋‚ด๊ฐ€ ์‹ค์ˆ˜ํ•˜์ง€ ์•Š๋Š” ํ•œ ํ”Œ๋žซํผ ๋…๋ฆฝ ์ธก๋ฉด์—์„œ ์ˆ˜ํ–‰๋œ ๊ทธ๋ฆผ์œผ๋กœ ์˜ค๋ฒ„๋ ˆ์ด๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ปจํŠธ๋กค๊ณผ ํ•จ๊ป˜ ๋” ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ์ปจํŠธ๋กค์„ ๊ฐ–๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ skia์ด๋“  ๋„ค์ดํ‹ฐ๋ธŒ ์บ”๋ฒ„์Šค ๋“œ๋กœ์ž‰์— ๋Œ€ํ•œ ์ผ์ข…์˜ ๋ฐฐ์น˜ interop์ด๋“  ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ถ”๊ตฌ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค! XF ํ”Œ๋žซํผ ๋ Œ๋”๋Ÿฌ ๋ชจ๋ธ์€ ํ•ญ์ƒ ์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ๊ฐ€์žฅ ์ ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” Microsoft UI ํ”Œ๋žซํผ์— ๊ฐ€์žฅ ํฐ ํ”ผํ•ด๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ปจํŠธ๋กค์ด ๋„ค์ดํ‹ฐ๋ธŒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ–์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ๋ ˆ์ด์•„์›ƒ ํ•ฉ์„ฑ๊ธฐ๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ƒ์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ทฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ•์†Œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ์ปจํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“  ์ปจํŠธ๋กค์ด skia์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ SkView๋กœ ๋งŒ๋“ค๊ณ  ๋ ˆ์ด๋ธ” ์ž์‹ ์ปจํŠธ๋กค์—์„œ ๊ทธ๋ฆฌ๊ธฐ ์ž‘์—…์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

I do not understand what a renderer is.
If the program for absorbing the visual differences of the target is called a renderer, it should be absorbed by Xamarin and MAUI altogether. If not, I think it 's an unfinished Xamarin and MAUI. And it will never be completed.
I think application programming should be more independent of the differences in the target environment.

๋ Œ๋”๋Ÿฌ๋ผ๋Š” ๊ฒƒ์ด ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋Œ€์ƒ์˜ ๋น„์ฃผ์–ผ์— ๋Œ€ํ•œ ์ฐจ์ด๋ฅผ ํก์ˆ˜ํ•˜๊ธฐ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋ Œ๋”๋Ÿฌ๋ผ๊ณ ํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ Xamarin๊ณผ MAUI์ด ๋ชจ๋‘ ํก์ˆ˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ ํ•˜๋ฉด ๊ทธ๊ฒƒ์€ Xamarin๋„ MAUI๋„ ๋ฏธ์™„์„ฑ์ด๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์˜์›ํžˆ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋” ๋Œ€์ƒ ํ™˜๊ฒฝ์˜ ์ฐจ์ด์—์„œ ๋…๋ฆฝ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

jsuarezruiz picture jsuarezruiz  ยท  12์ฝ”๋ฉ˜ํŠธ

probonopd picture probonopd  ยท  50์ฝ”๋ฉ˜ํŠธ

jsuarezruiz picture jsuarezruiz  ยท  6์ฝ”๋ฉ˜ํŠธ

Yaroslav08 picture Yaroslav08  ยท  6์ฝ”๋ฉ˜ํŠธ

Joshua-Ashton picture Joshua-Ashton  ยท  9์ฝ”๋ฉ˜ํŠธ