<p>Xamarin.Forms.Shell ์‚ฌ์–‘</p>

์— ๋งŒ๋“  2018๋…„ 04์›” 10์ผ  ยท  199์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: xamarin/Xamarin.Forms

Xamarin.Forms ์…ธ ์‚ฌ์–‘

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

Shell์€ ํŠน์ • ์ง€์ ์—์„œ ๋…๋‹จ์ ์ธ API์ด๋ฉฐ, ์‹คํ–‰ ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ .Default๋กœ ๋ชจ๋“  ๊ฐ’์„ ํ•ญ์ƒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ํ”Œ๋žซํผ ๊ธฐ๋ณธ๊ฐ’์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์กด์ค‘๋˜๋Š” ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋„๋ฉด ์‚ฌ์–‘์ด #2452๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ ์น˜๋ฃŒ

์Šคํฌ๋ฆฐ์ƒท์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค...

์‰˜ ๊ณ„์ธต

์ฒ˜์Œ์—๋Š” Shell ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์—๋Š” ์••๋„์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ํ’๋ถ€ํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ์ƒ์šฉ๊ตฌ xaml์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์…ธ์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ ์—†์ด ๋จผ์ € ํ•™์Šตํ•œ ๋‹ค์Œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ž‘์„ฑ๋˜๋Š” XAML์˜ ์–‘์„ ์‰ฝ๊ฒŒ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋’ค๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ์ƒ˜ํ”Œ์€ ์‚ฌ์–‘์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜๋˜๋Š” ํ…œํ”Œ๋ฆฟํ™”๋œ ShellContent๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ContentTemplate๊ณผ ํ•จ๊ป˜ ShellContents๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜์–ด ์‹œ์ž‘ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ์€ ํ•™์Šต์šฉ์ž…๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ ContentTemplates์™€ ํ•จ๊ป˜ ShellContents๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋กœ๊ฐ€๊ธฐ ์—†์Œ

์ด๋Ÿฌํ•œ ์ƒ˜ํ”Œ ์ค‘ ์ƒ๋‹น์ˆ˜๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด๊ฒƒ๋“ค์ด ๋‹จ์ˆœํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํ•œ ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       FlyoutBehavior="Disabled"
       x:Class="MyStore.Shell">

  <ShellItem>
    <ShellSection>
      <ShellContent>
        <local:HomePage />
      </ShellContent>
    </ShellSection>
  </ShellItem>
</Shell>

step1

MainPage์—์„œ Shell.NavBarVisible="false" ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ƒ๋‹จ ํ‘œ์‹œ์ค„์„ ์™„์ „ํžˆ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”Œ๋ผ์ด์•„์›ƒ์€ ์ด ๋ชจ๋“œ์—์„œ ๋‹ค์†Œ ํฌ๋ฐ•ํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ƒ˜ํ”Œ์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‹จ ํƒญ์ด ์žˆ๋Š” 2ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       FlyoutBehavior="Disabled"
       x:Class="MyStore.Shell">

  <ShellItem>

    <ShellSection Title="Home" Icon="home.png">
      <ShellContent>
        <local:HomePage />
      </ShellContent>
    </ShellSection>

    <ShellSection Title="Notifications" Icon="bell.png">
      <ShellContent>
        <local:NotificationsPage />
      </ShellContent>
    </ShellSection>

  </ShellItem>
</Shell>

step2

ShellSection ์„น์…˜์„ ShellItem ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜ ๋‹ค๋ฅธ ํ•˜๋‹จ ํƒญ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์ œ๋ชฉ๊ณผ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•˜๋ฉด ํƒญ ํ•ญ๋ชฉ ์ œ๋ชฉ๊ณผ ์•„์ด์ฝ˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๋‹จ ๋ฐ ํ•˜๋‹จ ํƒญ์ด ์žˆ๋Š” 2ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       FlyoutBehavior="Disabled"
       x:Class="MyStore.Shell">

  <ShellItem>

    <ShellSection Title="Home" Icon="home.png">
      <ShellContent>
        <local:HomePage />
      </ShellContent>
    </ShellSection>

    <ShellSection Title="Notifications" Icon="bell.png">

      <ShellContent Title="Recent">
        <local:NotificationsPage />
      </ShellContent>

      <ShellContent Title="Alert Settings">
        <local:SettingsPage />
      </ShellContent>

    </ShellSection>

  </ShellItem>
</Shell>

step3

๊ฐ€์‚ฐํ•จ์œผ๋กœ์จ ์ œ ShellContent ๋กœ ShellSection ์ƒ๋ถ€ ํƒญ ๋ง‰๋Œ€๋ฅผ ์ฒจ๊ฐ€ํ•˜๊ณ  ์•„๋ž˜์ชฝ ํŽ˜์ด์ง€๋Š” ํƒญ์ด ์„ ํƒ ๋  ๋•Œ ์‚ฌ์ด์— ๋Œ€์นญ๋œ๋‹ค.

ํ”Œ๋ผ์ด์•„์›ƒ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       x:Class="MyStore.Shell">

  <Shell.FlyoutHeader>
    <local:FlyoutHeader />
  </Shell.FlyoutHeader>

  <ShellItem Title="Home" Icon="home.png">
    <ShellSection>
      <ShellContent>
        <local:HomePage />
      </ShellContent>
    </ShellSection>
  </ShellItem>

  <ShellItem Title="Notifications" Icon="bell.png">
    <ShellSection>
      <ShellContent>
        <local:NotificationsPage />
      </ShellContent>
    </ShellSection>
  </ShellItem>
</Shell>

step4

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

๋‹จ์ถ• ๊ตฌ๋ฌธ ์‚ฌ์šฉ

์ด์ œ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์ˆ˜์ค€์ด ํ‘œ์‹œ๋˜๊ณ  ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋Œ€๋ถ€๋ถ„์˜ ๋ž˜ํ•‘์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Shell ์˜ค์ง ํฌํ•จ ShellItem ์˜ค์ง ํฌํ•จ S ShellSection ์ฐจ๋ก€๋กœ ์˜ค์ง ํฌํ•จ S ShellContent ๋“ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž๋™ ์—…๋ž˜ํ•‘์„ ํ—ˆ์šฉํ•˜๋Š” ์•”์‹œ์  ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํ•œ ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       FlyoutBehavior="Disabled"
       x:Class="MyStore.Shell">

  <local:HomePage />
</Shell>

์•”์‹œ์  ๋ž˜ํ•‘์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€๊ฐ€ ShellItem ๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ค‘๊ฐ„ ๋ ˆ์ด์–ด๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. Title ๋ฐ Icon ์œผ๋กœ๋ถ€ํ„ฐ Page ์–ด๋–ค ์•”์‹œ ์ ์œผ๋กœ ์ƒ์„ฑ ๋œ ๋ถ€๋ชจ๊นŒ์ง€ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.

ํ•˜๋‹จ ํƒญ์ด ์žˆ๋Š” 2ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       FlyoutBehavior="Disabled"
       x:Class="MyStore.Shell">

  <ShellItem>
    <local:HomePage Icon="home.png" />
    <local:NotificationsPage Icon="bell.png" />
  </ShellItem>
</Shell>

์ด์ œ ํŽ˜์ด์ง€๊ฐ€ ์•”์‹œ์ ์œผ๋กœ ShellContent ๋ฐ ์ž์ฒด ShellSection์œผ๋กœ ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํƒญ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ƒ๋‹จ ๋ฐ ํ•˜๋‹จ ํƒญ์ด ์žˆ๋Š” 2ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       FlyoutBehavior="Disabled"
       x:Class="MyStore.Shell">

  <ShellItem>
    <local:HomePage Icon="home.png" />

    <ShellSection Title="Notifications" Icon="bell.png">
        <local:NotificationsPage />
        <local:SettingsPage />
    </ShellSection>
  </ShellItem>
</Shell>

ํ”Œ๋ผ์ด์•„์›ƒ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ํŽ˜์ด์ง€ ์•ฑ

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:MyStore"
       x:Class="MyStore.Shell">

  <Shell.FlyoutHeader>
    <local:FlyoutHeader />
  </Shell.FlyoutHeader>

  <local:HomePage Icon="home.png" />
  <local:NotificationsPage Icon="bell.png" />
</Shell>

์—ฌ๊ธฐ์„œ ์•”์‹œ์  ๋ž˜ํ•‘์€ ์…ธ ํ•ญ๋ชฉ๊นŒ์ง€ ์ง„ํ–‰๋˜๋ฏ€๋กœ ์Šค์Šค๋กœ ๋ž˜ํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํƒ์ƒ‰ ๋ชจ๋ธ

ํ‘ธ์‹œ ํƒ์ƒ‰

๋ชจ๋“  ํƒ์ƒ‰์€ View์˜ .Navigation ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํ‘ธ์‹œ๋Š” ํ‘œ์‹œ๋œ ํ˜„์žฌ ShellSection์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ‘ธ์‹œ ์ด๋ฒคํŠธ์—์„œ ์ƒ๋‹จ ํƒญ์ด ์‚ฌ๋ผ์ง€๊ณ  ํ•˜๋‹จ ํƒญ์ด ๋‚จ์•„ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

URI ํƒ์ƒ‰

์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ํ‘œ์ค€ ํƒ์ƒ‰ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์…ธ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์…ธ์€ ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•œ ํƒ์ƒ‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

ํƒ์ƒ‰ URI์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[Shell.RouteScheme]://[Shell.RouteHost]/[Shell]/[ShellItem]/[ShellSection]/[ShellContent]/[NavStack1]/[NavStack2]...

์…ธ ๊ณ„์ธต์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์—๋Š” ์—ฐ๊ฒฐ๋œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„์— ๊ฒฝ๋กœ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ƒ์„ฑ ๊ฒฝ๋กœ๋Š” ์•ฑ์˜ ์—ฌ๋Ÿฌ ์‹คํ–‰์—์„œ ์•ˆ์ •์ ์ด๋ผ๊ณ  ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋”ฅ ๋งํฌ์— ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋’ค๋กœ ๋ฒ„ํŠผ ๋‹ค๋ฃจ๊ธฐ

Shell์€ ๊ธฐ๋ณธ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ถ€๋Ÿฌ์šด ์œ„์น˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋’ค๋กœ ๋ฒ„ํŠผ ์žฌ์ •์˜๊ฐ€ ์ง€์›๋  ์ˆ˜ ์žˆ๊ณ  ์ง€์›๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋’ค๋กœ ๋ฒ„ํŠผ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒํ˜ธ ์ž‘์šฉ ๊ฐ€๋กœ์ฑ„๊ธฐ ๋ฐ ์ค‘์ง€
  • ๋’ค๋กœ ๋ฒ„ํŠผ์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๊ต์ฒด
  • ์›ํ•  ๋•Œ ๋’ค๋กœ ๋ฒ„ํŠผ์„ ์™„์ „ํžˆ ์ˆจ๊ธฐ๊ธฐ
  • ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ํ•˜๋“œ์›จ์–ด ๋ฒ„ํŠผ ์ž‘์—…

API๋Š” ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ํŽ˜์ด์ง€ ์ˆ˜์ค€์œผ๋กœ ์„ธ๋ถ„ํ™”๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์ˆ˜์ค€์—์„œ ์Šคํƒ ์œ„๋กœ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ˜ํ”Œ ๋ฐ API

์‹œ๋ฃŒ

<Shell>
  <Shell.FlyoutHeaderTemplate>
    <DataTemplate>
      <Grid>
        <Label Text="{x:Bind HeaderText}" />
      </Grid>
    </DataTemplate>
  </Shell.FlyoutHeaderTemplate>

  // Flyout Item 1
  <ShellItem Title="My music" ItemsSource="{x:Bind MyMusicModels}" TabLocation="Bottom">
    <ShellItem.ItemTemplate>
      <local:MyMusicItemTemplateSelection />
    </ShellItem.ItemTemplate>
  </ShellItem>

  // Flyout Item 2
  <ShellItem Title="Home" Icon="home.png" GroupBehavior="ShowTabs">
    <ShellContent Title="My Friends">
      <local:FriendsPage />
    </ShellContent>
    <local:FeedPage />
    <local:ProfilePage />
  </ShellItem>

  // Flyout Item 3
  <local:SettingsPage />

  // Flyout Item 4
  <MenuItem Text="Log Out" Command="{x:Bind LogOutCommand}" />
</Shell>

Shell์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ ํŽ˜์ด์ง€ ์•ฑ

<Shell FlyoutVisibility="Disabled">
  <local:MyPage />
</Shell>

๋‹จ์ผ ํƒญ ๊ทธ๋ฃน ์•ฑ(ํ”Œ๋ผ์ด์•„์›ƒ ์—†์Œ)

<Shell FlyoutVisibility="Disabled">
  <ShellItem>
    <local:MyPage />
    <local:MySecondPage />
    <local:MyThirdPage />
  </ShellItem>
</Shell>

ํƒญ์ด ์—†๋Š” ํ”Œ๋ผ์ด์•„์›ƒ์˜ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€

<Shell FlyoutVisibility="Disabled">
  <local:MyPage />
  <local:MySecondPage />
  <local:MyThirdPage />
</Shell>

๋‹จ์ผ ํŽ˜์ด์ง€ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ ์•ฑ

<Shell FlyoutVisibility="Disabled">
  <local:MyPage />
</Shell>

```์ƒคํ”„
๊ณต๊ฐœ ํด๋ž˜์Šค MyPage : ContentPage
{
๊ณต๊ฐœ ํด๋ž˜์Šค MyPageSearchHandler : SearchHandler
{
๊ณต๊ฐœ MyPageHandler()
{
SearchBoxVisibility = SearchBoxVisibility.Collapsed;
IsSearchEnabled = true;
์ž๋ฆฌ ํ‘œ์‹œ์ž = "๋‚˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”!";
}

protected override async void OnSearchConfirmed (string query)
{
  IsSearching = true;

  await PerformSearch (query);
  UpdateResults ();

  IsSearching = false;
}

protected override void OnSearchChanged (string oldValue, string newValue)
{
  // Do nothing, we will wait for confirmation
}

}

๊ณต๊ฐœ ๋งˆ์ดํŽ˜์ด์ง€()
{
Shell.SetSearchHandler(์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด MyPageSearchHandler());
}
}

## API Definition

### Shell
This is the base class for Shell's. It defines a somewhat strict navigational model however all shells must adhere to it in general. It does not include any theming or design language specific features.

```csharp
[ContentProperty("Items")]
public class Shell : Page, IShellController
{
  // Attached Properties
  public static readonly BindableProperty BackButtonBehaviorProperty;
  public static readonly BindableProperty FlyoutBehaviorProperty;
  public static readonly BindableProperty NavBarVisibleProperty;
  public static readonly BindableProperty SearchHandlerProperty;
  public static readonly BindableProperty SetPaddingInsetsProperty;
  public static readonly BindableProperty TabBarVisibleProperty;
  public static readonly BindableProperty TitleViewProperty;
  public static readonly BindableProperty ShellBackgroundColorProperty;
  public static readonly BindableProperty ShellDisabledColorProperty;
  public static readonly BindableProperty ShellForegroundColorProperty;
  public static readonly BindableProperty ShellTabBarBackgroundColorProperty;
  public static readonly BindableProperty ShellTabBarDisabledColorProperty;
  public static readonly BindableProperty ShellTabBarForegroundColorProperty;
  public static readonly BindableProperty ShellTabBarTitleColorProperty;
  public static readonly BindableProperty ShellTabBarUnselectedColorProperty;
  public static readonly BindableProperty ShellTitleColorProperty;
  public static readonly BindableProperty ShellUnselectedColorProperty;

  public static BackButtonBehavior GetBackButtonBehavior(BindableObject obj);
  public static FlyoutBehavior GetFlyoutBehavior(BindableObject obj);
  public static bool GetNavBarVisible(BindableObject obj);
  public static SearchHandler GetSearchHandler(BindableObject obj);
  public static bool GetSetPaddingInsets(BindableObject obj);
  public static bool GetTabBarVisible(BindableObject obj);
  public static View GetTitleView(BindableObject obj);
  public static void SetBackButtonBehavior(BindableObject obj, BackButtonBehavior behavior);
  public static void SetFlyoutBehavior(BindableObject obj, FlyoutBehavior value);
  public static void SetNavBarVisible(BindableObject obj, bool value);
  public static void SetSearchHandler(BindableObject obj, SearchHandler handler);
  public static void SetSetPaddingInsets(BindableObject obj, bool value);
  public static void SetTabBarVisible(BindableObject obj, bool value);
  public static void SetTitleView(BindableObject obj, View value);
  public static Color GetShellBackgroundColor(BindableObject obj);
  public static Color GetShellDisabledColor(BindableObject obj);
  public static Color GetShellForegroundColor(BindableObject obj);
  public static Color GetShellTabBarBackgroundColor(BindableObject obj);
  public static Color GetShellTabBarDisabledColor(BindableObject obj);
  public static Color GetShellTabBarForegroundColor(BindableObject obj);
  public static Color GetShellTabBarTitleColor(BindableObject obj);
  public static Color GetShellTabBarUnselectedColor(BindableObject obj);
  public static Color GetShellTitleColor(BindableObject obj);
  public static Color GetShellUnselectedColor(BindableObject obj);
  public static void SetShellBackgroundColor(BindableObject obj, Color value);
  public static void SetShellDisabledColor(BindableObject obj, Color value);
  public static void SetShellForegroundColor(BindableObject obj, Color value);
  public static void SetShellTabBarBackgroundColor(BindableObject obj, Color value);
  public static void SetShellTabBarDisabledColor(BindableObject obj, Color value);
  public static void SetShellTabBarForegroundColor(BindableObject obj, Color value);
  public static void SetShellTabBarTitleColor(BindableObject obj, Color value);
  public static void SetShellTabBarUnselectedColor(BindableObject obj, Color value);
  public static void SetShellTitleColor(BindableObject obj, Color value);
  public static void SetShellUnselectedColor(BindableObject obj, Color value);

  // Bindable Properties
  public static readonly BindableProperty CurrentItemProperty;
  public static readonly BindableProperty CurrentStateProperty;
  public static readonly BindableProperty FlyoutBackgroundColorProperty;
  public static readonly BindableProperty FlyoutHeaderBehaviorProperty;
  public static readonly BindableProperty FlyoutHeaderProperty;
  public static readonly BindableProperty FlyoutHeaderTemplateProperty;
  public static readonly BindableProperty FlyoutIsPresentedProperty;
  public static readonly BindableProperty GroupHeaderTemplateProperty;
  public static readonly BindableProperty ItemsProperty;
  public static readonly BindableProperty ItemTemplateProperty;
  public static readonly BindableProperty MenuItemsProperty;
  public static readonly BindableProperty MenuItemTemplateProperty;

  public Shell();

  public event EventHandler<ShellNavigatedEventArgs> Navigated;

  public event EventHandler<ShellNavigatingEventArgs> Navigating;

  public ShellItem CurrentItem {get; set;}

  public ShellNavigationState CurrentState {get; }

  public Color FlyoutBackgroundColor {get; set;}

  public FlyoutBehavior FlyoutBehavior {get; set;}

  public object FlyoutHeader {get; set;}

  public FlyoutHeaderBehavior FlyoutHeaderBehavior {get; set;}

  public DataTemplate FlyoutHeaderTemplate {get; set;}

  public bool FlyoutIsPresented {get; set;}

  public DataTemplate GroupHeaderTemplate {get; set;}

  public ShellItemCollection Items {get; }

  public DataTemplate ItemTemplate {get; set;}

  public MenuItemCollection MenuItems {get; }

  public DataTemplate MenuItemTemplate {get; set;}

  public string Route {get; set;}

  public string RouteHost { get; set; }

  public string RouteScheme { get; set; }

  public async Task GoToAsync(ShellNavigationState state, bool animate = true);

  protected virtual void OnNavigated(ShellNavigatedEventArgs args);

  protected virtual void OnNavigating(ShellNavigatingEventArgs args);
}

์„ค๋ช…

์ฒจ๋ถ€๋œ ์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ๊ฒ€์ƒ‰ ํ•ธ๋“ค๋Ÿฌ ์†์„ฑ | ํŽ˜์ด์ง€ ์ˆ˜์ค€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์˜ ์ •์˜์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ๋œ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์—ฌ๋Ÿฌ ์ง€์ ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ •์˜๋œ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. https://material.io/guidelines/patterns/search.html#search -in-app-search |
| BackButton๋™์ž‘ | ๋’ค๋กœ ๋ฒ„ํŠผ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์™„์ „ํžˆ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ๋ฐ ๋ฌผ๋ฆฌ์  ๋’ค๋กœ ๋ฒ„ํŠผ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. |
| ํ”Œ๋ผ์ด์•„์›ƒ ๋™์ž‘ | ํ”Œ๋ผ์ด์•„์›ƒ์ด ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ShellItem s, ShellContent s ๋˜๋Š” Page s์— ์—ฐ๊ฒฐํ•˜์—ฌ ๊ธฐ๋ณธ ๋™์ž‘์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| NavBarVisibleProperty | NavBar๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Page ์— ์†์„ฑ ์„ค์ • |
| SetPaddingInsetsProperty | Page ์— ์ด ์†์„ฑ์„ ์„ค์ •ํ•˜๋ฉด Padding ๊ฐ€ ์„ค์ •๋˜์–ด ํ•ด๋‹น ์ฝ˜ํ…์ธ ๊ฐ€ Shell ํฌ๋กฌ ์•„๋ž˜์—์„œ ํ๋ฅด์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. |
| TabBarVisibleProperty | TabBar๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Page ์— ์†์„ฑ ์„ค์ • |
| TitleView ์†์„ฑ | ์— ์†์„ฑ ํ•œ ์„ธํŠธ์ž…๋‹ˆ๋‹ค Page ์ •์˜ ํ•  ์ˆ˜์žˆ๋Š” TitleView |
| ShellBackgroundColor ์†์„ฑ | ์…ธ์˜ ํฌ๋กฌ ์š”์†Œ์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฐฐ๊ฒฝ์ƒ‰์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒ‰์ƒ์€ ์…ธ ๋‚ด์šฉ ๋’ค์— ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. |
| ShellDisabledColorProperty | ๋น„ํ™œ์„ฑํ™”๋œ ํ…์ŠคํŠธ/์•„์ด์ฝ˜์„ ์Œ์˜ ์ฒ˜๋ฆฌํ•  ์ƒ‰์ƒ |
| ShellForegroundColor ์†์„ฑ | ์‰˜์˜ ์ผ๋ฐ˜ ํ…์ŠคํŠธ/์•„์ด์ฝ˜ ์Œ์˜ ์ฒ˜๋ฆฌ ์ƒ‰์ƒ |
| ShellTabBarBackgroundColorProperty | TabBar์— ๋Œ€ํ•œ ShellBackgroudnColor ์žฌ์ •์˜. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ShellBackgroundColor๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค |
| ShellTabBarDisabledColorProperty | TabBar์— ๋Œ€ํ•œ ShellDisabledColor ์žฌ์ •์˜. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ShellDisabledColorProperty๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. |
| ShellTabBarForegroundColorProperty | TabBar์— ๋Œ€ํ•œ ShellForegroundColorProperty ์žฌ์ •์˜. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ShellForegroundColorProperty๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค |
| ShellTabBarTitleColorProperty | TabBar์— ๋Œ€ํ•œ ShellTitleColorProperty ์žฌ์ •์˜. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ShellTitleColorProperty๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. |
| ShellTabBarUnselectedColorProperty | TabBar์— ๋Œ€ํ•œ ShellUnselectedColorProperty ์žฌ์ •์˜. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ShellUnselectedColorProperty๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. |
| ShellTitleColor ์†์„ฑ | ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ์— ์‚ฌ์šฉ๋œ ์ƒ‰์ƒ |
| ShellUnselectedColorProperty | ์…ธ์—์„œ ์„ ํƒ๋˜์ง€ ์•Š์€ ํ…์ŠคํŠธ/์•„์ด์ฝ˜์— ์‚ฌ์šฉ๋˜๋Š” ์ƒ‰์ƒ chrome |

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ํ˜„์žฌ ํ•ญ๋ชฉ | ํ˜„์žฌ ์„ ํƒ๋œ ShellItem |
| ํ˜„์žฌ ์ƒํƒœ | ์…ธ์˜ ํ˜„์žฌ ํƒ์ƒ‰ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด ์ƒํƒœ๋ฅผ GoToAsync์— ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋ฉด ์…ธ์ด ๋’ค๋กœ ํƒ์ƒ‰ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. |
| FlyoutBackgroundColorProperty | ํ”Œ๋ผ์ด์•„์›ƒ ๋ฉ”๋‰ด์˜ ๋ฐฐ๊ฒฝ์ƒ‰ |
| ํ”Œ๋ผ์ด์•„์›ƒ ๋™์ž‘ | ๊ธฐ๋ณธ ์„ค์ • FlyoutBehavior ์— ๋Œ€ํ•œ Shell . |
| ํ”Œ๋ผ์ด์•„์›ƒํ—ค๋” | ํ”Œ๋ผ์ด์•„์›ƒ์˜ ํ—ค๋”๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. FlyoutHeaderTemplate ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด BindingContext ๋กœ ํŒฝ์ฐฝ๋œ ๊ฐœ์ฒด์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. FlyoutHeaderTemplate ๊ฐ€ null์ด๊ณ  FlyoutHeader ๊ฐ€ View ์œ ํ˜•์ด๋ฉด ์ง์ ‘ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ToString()์„ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. |
| ํ”Œ๋ผ์ด์•„์›ƒํ—ค๋”๋™์ž‘ | ๋‚ด์šฉ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋ผ์ด์•„์›ƒ์„ ์Šคํฌ๋กคํ•ด์•ผ ํ•  ๋•Œ FlyoutHeader ์˜ ๋™์ž‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. |
| ํ”Œ๋ผ์ด์•„์›ƒ ํ—ค๋” ํ…œํ”Œ๋ฆฟ | ํ”Œ๋ผ์ด์•„์›ƒ์˜ ํ—ค๋”๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. |
| ํ”Œ๋ผ์ด์•„์›ƒ์ด ์ œ์‹œ๋จ | ํ”Œ๋ผ์ด์•„์›ƒ์ด ํ˜„์žฌ ํ‘œ์‹œ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. |
| ๊ทธ๋ฃน ํ—ค๋” ํ…œํ”Œ๋ฆฟ | ShellItem ๊ฐ€ ํ”Œ๋ผ์ด์•„์›ƒ์—์„œ ํƒญ ๊ทธ๋ฃน์œผ๋กœ ํ‘œ์‹œ๋˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ DataTemplate ๊ทธ๋ฃน ํ—ค๋”๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. null์ด๋ฉด ํ—ค๋”๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. |
| ํ•ญ๋ชฉ | ์…ธ์˜ ๊ธฐ๋ณธ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์€ ํ”Œ๋ผ์ด์•„์›ƒ์— ํ‘œ์‹œํ•  ํ•ญ๋ชฉ ๋ชฉ๋ก๊ณผ ์‚ฌ์ด๋“œ๋ฐ” ํ•ญ๋ชฉ์„ ์„ ํƒํ•  ๋•Œ ํ‘œ์‹œ๋  ์ฝ˜ํ…์ธ ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. |
| ํ•ญ๋ชฉ ํ…œํ”Œ๋ฆฟ | DataTemplate ํ”Œ๋ผ์ด์•„์›ƒ์—์„œ Items ์ปฌ๋ ‰์…˜์˜ ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”Œ๋ผ์ด์•„์›ƒ์—์„œ ์‹œ๊ฐ์  ๊ฐœ์ฒด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| ๋ฉ”๋‰ด ํ•ญ๋ชฉ | ์ž์ฒด ์„น์…˜์˜ ํ”Œ๋ผ์ด์•„์›ƒ์— ํ‘œ์‹œ๋  MenuItem ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. |
| ๋ฉ”๋‰ด ํ•ญ๋ชฉ ํ…œํ”Œ๋ฆฟ | DataTemplate ์‚ฌ์šฉ์— ํ‘œ์‹œ ๋  ๋•Œ MenuItem ํ”Œ๋ผ์ด ์•„์›ƒ์—. |
| ๋…ธ์„  | ๋”ฅ๋งํ‚น์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ด ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. |
| ๋ฃจํŠธํ˜ธ์ŠคํŠธ | ๋”ฅ๋งํฌ ์ƒ์„ฑ ์‹œ ์ƒ์„ฑ๋œ URI์˜ ํ˜ธ์ŠคํŠธ ๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•  ๋ฌธ์ž์—ด |
| ๋…ธ์„ ํ‘œ | ๋”ฅ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์„ฑ๋œ URI์˜ ์Šคํ‚ค๋งˆ ๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•  ๋ฌธ์ž์—ด |

๊ณต๊ฐœ ๋ฐฉ๋ฒ•:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| GoToAsync | ShellNavigationState ํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์™„๋ฃŒ๋˜๋ฉด ์™„๋ฃŒ๋  ์ž‘์—…์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. |

๊ณต๊ฐœ ์ด๋ฒคํŠธ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ํƒ์ƒ‰ | Shell ๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ๋˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ ์ธํ•ด ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ํƒ์ƒ‰์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| ํƒ์ƒ‰ | Shell ์ด(๊ฐ€) ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. |

ShellItemCollection

ShellItem ์ปฌ๋ ‰์…˜

public sealed class ShellItemCollection : IEnumerable<ShellItem>, IList<ShellItem>

๋ฉ”๋‰ด ํ•ญ๋ชฉ ์ปฌ๋ ‰์…˜

MenuItem ์ปฌ๋ ‰์…˜

public sealed class MenuItemCollection : IEnumerable<MenuItem>, IList<MenuItem>

ShellSectionCollection

ShellSection ์ปฌ๋ ‰์…˜

public sealed class ShellSectionCollection : IEnumerable<ShellSection>, IList<ShellSection>

ShellContentCollection

ShellContent ์ปฌ๋ ‰์…˜

public sealed class ShellContentCollection : IEnumerable<ShellContent>, IList<ShellContent>

ShellNavigatingEventArgs

๋ฐœ์ƒํ•˜๋ ค๋Š” ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” EventArgs ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ShellNavigationEventArgs ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

public class ShellNavigatingEventArgs : EventArgs
{
  public ShellNavigationState Current { get; }

  public ShellNavigationState Target { get; }

  public ShellNavigationSource Source { get; }

  public bool CanCancel { get; }

  public bool Cancel ();
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ํ˜„์žฌ | Shell ์˜ ํ˜„์žฌ NavigationState์ž…๋‹ˆ๋‹ค. ์ด ShellNavigationState GoToAsync ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด ํƒ์ƒ‰ ์ด๋ฒคํŠธ๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. |
| ๋Œ€์ƒ | ์ด ํƒ์ƒ‰ ์ด๋ฒคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ Shell ์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. |
| ์ถœ์ฒ˜ | ์ด ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•œ ํƒ์ƒ‰ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| ์ทจ์†Œ ์ทจ์†Œ | ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. |

๊ณต๊ฐœ ๋ฐฉ๋ฒ•:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ์ทจ์†Œ | ํ˜„์žฌ ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ์— ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. |

ShellNavigatedEventArgs

public class ShellNavigatedEventArgs : EventArgs
{
  public ShellNavigationState Previous { get; }

  public ShellNavigationState Current { get; }

  public ShellNavigationSource Source { get; }
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ์ด์ „ | Shell ์˜ ์ด์ „ NavigationState์ž…๋‹ˆ๋‹ค. |
| ํ˜„์žฌ | ์ด ํƒ์ƒ‰ ์ด๋ฒคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ Shell ์˜ ์ƒˆ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. |
| ์ถœ์ฒ˜ | ์ด ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•œ ํƒ์ƒ‰ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |

ShellNavigationState

public class ShellNavigationState
{
  public Uri Location { get; set; }

  public ShellNavigationState ();
  public ShellNavigationState (string location);
  public ShellNavigationState (Uri uri);

  public static implicit operator ShellNavigationState (Uri uri);
  public static implicit operator ShellNavigationState (String value);
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ์œ„์น˜ | Shell ์˜ ํƒ์ƒ‰ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•˜๋Š” Uri |

์ƒ์„ฑ์ž:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| (๋ฌดํšจ) | null ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ShellNavigationState ์ƒ์„ฑ |
| (๋ฌธ์ž์—ด) | ์ œ๊ณต๋œ string ์„ค์ •๋œ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ShellNavigationState ์ƒ์„ฑ |
| (์šฐ๋ฆฌ) | ์ œ๊ณต๋œ Uri ์„ค์ •๋œ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ShellNavigationState ์ƒ์„ฑ |

ShellNavigationSource

[Flags]
public enum ShellNavigationSource
{
  Unknown = 0,
  Push,
  Pop,
  PopToRoot,
  Insert,
  Remove,
  ShellItemChanged,
  ShellSectionChanged,
  ShellContentChanged,
}

BaseShellํ•ญ๋ชฉ

public class BaseShellItem : NavigableElement
{
  public static readonly BindableProperty FlyoutIconProperty;
  public static readonly BindableProperty IconProperty;
  public static readonly BindableProperty IsCheckedProperty;
  public static readonly BindableProperty IsEnabledProperty;
  public static readonly BindableProperty TitleProperty;

  public ImageSource FlyoutIcon { get; set; }

  public ImageSource Icon { get; set; }

  public bool IsChecked { get; }

  public bool IsEnabled { get; set; }

  public string Route { get; set; }

  public string Title { get; set; }
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ํ”Œ๋ผ์ด์•„์›ƒ ์•„์ด์ฝ˜ | ํ”Œ๋ผ์ด์•„์›ƒ์— ํ‘œ์‹œ๋  ๋•Œ ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ ์•„์ด์ฝ˜์ž…๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„์ด์ฝ˜์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. |
| ์•„์ด์ฝ˜ | ํ”Œ๋ผ์ด์•„์›ƒ์ด ์•„๋‹Œ ํฌ๋กฌ ๋ถ€๋ถ„์— ํ‘œ์‹œํ•  ์•„์ด์ฝ˜์ž…๋‹ˆ๋‹ค. |
| ์ฒดํฌ๋จ | BaseShellItem ๊ฐ€ ํ˜„์žฌ ํ”Œ๋ผ์ด์•„์›ƒ์—์„œ ์„ ํƒ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ(๋”ฐ๋ผ์„œ ๊ฐ•์กฐ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•จ) |
| ํ™œ์„ฑํ™”๋จ | BaseShellItem ๊ฐ€ ํฌ๋กฌ์—์„œ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ |
| ๋…ธ์„  | Routing.Route ์„ค์ •์— ํ•ด๋‹น |
| ์ œ๋ชฉ | UI์— ํ‘œ์‹œํ•  ์ œ๋ชฉ |

์…ธ ๊ทธ๋ฃน ํ•ญ๋ชฉ

public class ShellGroupItem : BaseShellItem
{
  public static readonly BindableProperty FlyoutDisplayOptionsProperty;;

  public FlyoutDisplayOptions FlyoutDisplayOptions { get; set; }
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ํ”Œ๋ผ์ด์•„์›ƒ๋””์Šคํ”Œ๋ ˆ์ด์˜ต์…˜ | ์ด ํ•ญ๋ชฉ๊ณผ ํ•ด๋‹น ํ•˜์œ„ ํ•ญ๋ชฉ์ด ํ”Œ๋ผ์ด์•„์›ƒ์— ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. |

์‰˜ ์•„์ดํ…œ

[ContentProperty("Items")]
public class ShellItem : ShellGroupItem, IShellItemController, IElementConfiguration<ShellItem>
{
  public static readonly BindableProperty CurrentItemProperty;

  public ShellItem();

  public ShellSection CurrentItem { get; set; }

  public ShellSectionCollection Items;

  public static implicit operator ShellItem(ShellSection shellSection);

  public static implicit operator ShellItem(ShellContent shellContent);

  public static implicit operator ShellItem(TemplatedPage page);

  public static implicit operator ShellItem(MenuItem menuItem);
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ํ˜„์žฌ ํ•ญ๋ชฉ | ์„ ํƒํ•œ ShellSection . |
| ํ•ญ๋ชฉ | ShellItem์˜ ๊ธฐ๋ณธ ์ฝ˜ํ…์ธ ์ธ ShellSectionCollection ์ž…๋‹ˆ๋‹ค. ์ด ์ปฌ๋ ‰์…˜์€ ShellItem ๋‚ด์˜ ๋ชจ๋“  ํƒญ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. |

์‰˜์„น์…˜

[ContentProperty("Items")]
public class ShellSection : ShellGroupItem, IShellSectionController
{
  public static readonly BindableProperty CurrentItemProperty;
  public static readonly BindableProperty ItemsProperty

  public ShellSection();

  public ShellContent CurrentItem { get; set; }

  public ShellContentCollection Items { get; }

  public IReadOnlyList<Page> Stack { get; }

  public static implicit operator ShellSection(ShellContent shellContent);

  public virtual async Task GoToAsync(List<string> routes, IDictionary<string, string> queryData, bool animate);

  protected virtual IReadOnlyList<Page> GetNavigationStack();

  protected virtual void OnInsertPageBefore(Page page, Page before);

  protected async virtual Task<Page> OnPopAsync(bool animated);

  protected virtual async Task OnPopToRootAsync(bool animated);

  protected virtual Task OnPushAsync(Page page, bool animated);

  protected virtual void OnRemovePage(Page page);
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ํ˜„์žฌ ํ•ญ๋ชฉ | ShellSection์˜ ์„ ํƒ๋œ ShellContent ์ž…๋‹ˆ๋‹ค. |
| ํ•ญ๋ชฉ | ShellContentCollection ๋Š” ShellSection์˜ ๋ฃจํŠธ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. |
| ์Šคํƒ | ShellSection์—์„œ ํ˜„์žฌ ํ‘ธ์‹œ๋œ ํƒ์ƒ‰ ์Šคํƒ์ž…๋‹ˆ๋‹ค. |

ํ–‰๋™ ์–‘์‹:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| GoToAsync | ๋”ฅ๋งํฌ์—์„œ ์•Œ๋ ค์ง„ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ง์ ‘ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. |
| GetNavigationStack | ํ˜„์žฌ ํƒ์ƒ‰ ์Šคํƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. |
| OnInsertPageBefore | INavigation ์ธํ„ฐํŽ˜์ด์Šค InsertPageBefore ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ˜ธ์ถœ๋จ |
| OnPopAsync | INavigation ์ธํ„ฐํŽ˜์ด์Šค PopAsync ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ˜ธ์ถœ๋จ |
| OnPopToRootAsync | INavigation ์ธํ„ฐํŽ˜์ด์Šค PopToRootAsync ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ˜ธ์ถœ๋จ |
| OnPushAsync | INavigation ์ธํ„ฐํŽ˜์ด์Šค PushAsync ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ˜ธ์ถœ๋จ |
| ์ œ๊ฑฐ ํŽ˜์ด์ง€ | INavigation ์ธํ„ฐํŽ˜์ด์Šค RemovePage ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ˜ธ์ถœ๋จ |

์…ธ ์ฝ˜ํ…์ธ 

[ContentProperty("Content")]
public class ShellContent : BaseShellItem, IShellContentController
{
  public static readonly BindableProperty ContentProperty;
  public static readonly BindableProperty ContentTemplateProperty;
  public static readonly BindableProperty MenuItemsProperty;

  public ShellContent();

  public object Content { get; set; }

  public DataTemplate ContentTemplate { get; set; }

  public MenuItemCollection MenuItems { get; }

  public static implicit operator ShellContent(TemplatedPage page);
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ๋‚ด์šฉ | ShellContent์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ContentPage ๋˜๋Š” BindingContext ์˜ Page ์— ์˜ํ•ด ํŒฝ์ฐฝ ContentTemplate |
| ์ฝ˜ํ…์ธ  ํ…œํ”Œ๋ฆฟ | ShellContent ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋™์ ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Content ์†์„ฑ์€ ์ธํ”Œ๋ ˆ์ด์…˜ ํ›„ BindingContext ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. |
| ๋ฉ”๋‰ด ํ•ญ๋ชฉ | ์ด ShellContent๊ฐ€ ํ‘œ์‹œ๋œ ํŽ˜์ด์ง€์ผ ๋•Œ ํ”Œ๋ผ์ด์•„์›ƒ์— ํ‘œ์‹œํ•  ํ•ญ๋ชฉ |

๊ฒ€์ƒ‰ ํ•ธ๋“ค๋Ÿฌ

public class SearchHandler : BindableObject, ISearchHandlerController
{
  public static readonly BindableProperty ClearIconHelpTextProperty;
  public static readonly BindableProperty ClearIconNameProperty;
  public static readonly BindableProperty ClearIconProperty;
  public static readonly BindableProperty ClearPlaceholderCommandParameterProperty;
  public static readonly BindableProperty ClearPlaceholderCommandProperty;
  public static readonly BindableProperty ClearPlaceholderEnabledProperty;
  public static readonly BindableProperty ClearPlaceholderHelpTextProperty;
  public static readonly BindableProperty ClearPlaceholderIconProperty;
  public static readonly BindableProperty ClearPlaceholderNameProperty;
  public static readonly BindableProperty CommandParameterProperty;
  public static readonly BindableProperty CommandProperty;
  public static readonly BindableProperty DisplayMemberNameProperty;
  public static readonly BindableProperty IsSearchEnabledProperty;
  public static readonly BindableProperty ItemsSourceProperty;
  public static readonly BindableProperty ItemTemplateProperty;
  public static readonly BindableProperty PlaceholderProperty;
  public static readonly BindableProperty QueryIconHelpTextProperty;
  public static readonly BindableProperty QueryIconNameProperty;
  public static readonly BindableProperty QueryIconProperty;
  public static readonly BindableProperty QueryProperty;
  public static readonly BindableProperty SearchBoxVisibilityProperty;
  public static readonly BindableProperty ShowsResultsProperty;

  public ImageSource ClearIcon { get; set; }

  public string ClearIconHelpText { get; set; }

  public string ClearIconName { get; set; }

  public ICommand ClearPlaceholderCommand { get; set; }

  public object ClearPlaceholderCommandParameter { get; set; }

  public bool ClearPlaceholderEnabled { get; set; }

  public string ClearPlaceholderHelpText { get; set; }

  public ImageSource ClearPlaceholderIcon { get; set; }

  public string ClearPlaceholderName { get; set; }

  public ICommand Command { get; set; }

  public object CommandParameter { get; set; }

  public string DisplayMemberName { get; set; }

  public bool IsSearchEnabled { get; set; }

  public IEnumerable ItemsSource { get; set; }

  public DataTemplate ItemTemplate { get; set; }

  public string Placeholder { get; set; }

  public string Query { get; set; }

  public ImageSource QueryIcon { get; set; }

  public string QueryIconHelpText { get; set; }

  public string QueryIconName { get; set; }

  public SearchBoxVisiblity SearchBoxVisibility { get; set; }

  public bool ShowsResults { get; set; }

  protected virtual void OnClearPlaceholderClicked();

  protected virtual void OnItemSelected(object item);

  protected virtual void OnQueryChanged(string oldValue, string newValue);

  protected virtual void OnQueryConfirmed();
}

์†์„ฑ:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ClearIconHelpText | ์ง€์šฐ๊ธฐ ์•„์ด์ฝ˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๋„์›€๋ง ํ…์ŠคํŠธ |
| ClearIconName์†์„ฑ | ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ง€์šฐ๊ธฐ ์•„์ด์ฝ˜์˜ ์ด๋ฆ„ |
| ํด๋ฆฌ์–ด ์•„์ด์ฝ˜ | ๊ฒ€์ƒ‰ ์ƒ์ž์˜ ๋‚ด์šฉ์„ ์ง€์šฐ๊ธฐ ์œ„ํ•ด ํ‘œ์‹œ๋˜๋Š” ์•„์ด์ฝ˜์ž…๋‹ˆ๋‹ค. |
| ClearPlaceholder๋ช…๋ น ๋งค๊ฐœ๋ณ€์ˆ˜ | ClearPlaceholderCommand ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ |
| ClearPlacehodlerCommand | ClearPlaceholder ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅผ ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น |
| ClearPlaceholderEnabled | ClearPlaceholderIcon์˜ ํ™œ์„ฑํ™” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค. |
| ClearPlaceholderHelpText | ๋ช…ํ™•ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž ์•„์ด์ฝ˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๋„์›€๋ง ํ…์ŠคํŠธ |
| ClearPlaceholderIcon | ๊ฒ€์ƒ‰ ์ƒ์ž๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ ClearIcon ์œ„์น˜์— ํ‘œ์‹œ๋˜๋Š” ์•„์ด์ฝ˜์ž…๋‹ˆ๋‹ค. |
| ClearPlaceholderName | ํ™”๋ฉด ํŒ๋…๊ธฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž ์•„์ด์ฝ˜์˜ ์ด๋ฆ„ |
| ๋ช…๋ น ๋งค๊ฐœ๋ณ€์ˆ˜ | Command ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ |
| ๋ช…๋ น | ์ฟผ๋ฆฌ ํ™•์ธ ์‹œ ์‹คํ–‰ํ•  ICommand
| DisplayMemberPath | ItemsSource ๊ฐ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ํ‘œ์‹œ๋˜๋Š” ์†์„ฑ์˜ ์ด๋ฆ„ ๋˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. |
| ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ | ๊ฒ€์ƒ‰ ์ƒ์ž์˜ ํ™œ์„ฑํ™” ์ƒํƒœ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. |
| ํ•ญ๋ชฉ ์†Œ์Šค | ์ œ์•ˆ ์˜์—ญ์— ํ‘œ์‹œํ•  ํ•ญ๋ชฉ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. |
| ํ•ญ๋ชฉ ํ…œํ”Œ๋ฆฟ | ์ œ์•ˆ ์˜์—ญ์— ํ‘œ์‹œ๋˜๋Š” ํ•ญ๋ชฉ์˜ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. |
| ์ž๋ฆฌ ํ‘œ์‹œ์ž | ๊ฒ€์ƒ‰ ์ƒ์ž๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ ํ‘œ์‹œํ•  ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. |
| QueryIconHelpText์†์„ฑ | ์ฟผ๋ฆฌ ์•„์ด์ฝ˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๋„์›€๋ง ํ…์ŠคํŠธ |
| QueryIconName์†์„ฑ | ํ™”๋ฉด ํŒ๋…๊ธฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ ์•„์ด์ฝ˜์˜ ์ด๋ฆ„ |
| ์ฟผ๋ฆฌ ์•„์ด์ฝ˜ | ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•จ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์•„์ด์ฝ˜ |
| ์ฟผ๋ฆฌ | ๊ฒ€์ƒ‰ ์ƒ์ž์˜ ํ˜„์žฌ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. |
| SearchBox๊ฐ€์‹œ์„ฑ | Shell ํฌ๋กฌ์—์„œ ๊ฒ€์ƒ‰ ์ƒ์ž์˜ ๊ฐ€์‹œ์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. |
| ์‡ผ๊ฒฐ๊ณผ | ํ…์ŠคํŠธ ์ž…๋ ฅ ์‹œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ • |

๋ณดํ˜ธ ๋ฐฉ๋ฒ•:

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| OnClearPlaceholderClicked | ClearPlaceholder ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. |
| ํ•ญ๋ชฉ ์„ ํƒ๋จ | ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋จ |
| OnQueryํ™•์ธ๋จ | ์‚ฌ์šฉ์ž๊ฐ€ Enter ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ ์ƒ์ž์—์„œ ํ•ญ๋ชฉ์„ ํ™•์ธํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. |
| ์ฟผ๋ฆฌ ๋ณ€๊ฒฝ๋จ | Query ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. |

๊ฒ€์ƒ‰์ฐฝ ๊ฐ€์‹œ์„ฑ

public enum SearchBoxVisiblity
{
  Hidden,
  Collapsable,
  Expanded
}

| ๊ฐ€์น˜ | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ์ˆจ๊ฒจ์ง„ | ๊ฒ€์ƒ‰ ์ƒ์ž๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ฑฐ๋‚˜ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. |
| ์ ‘์„ ์ˆ˜ ์žˆ๋Š” | ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ ์ƒ์ž๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๊นŒ์ง€ ๊ฒ€์ƒ‰ ์ƒ์ž๊ฐ€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค. |
| ํ™•์žฅ | ๊ฒ€์ƒ‰ ์ƒ์ž๋Š” ์™„์ „ํžˆ ํ™•์žฅ๋œ ํ•ญ๋ชฉ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. |

BackButton๋™์ž‘

public class BackButtonBehavior : BindableObject
{
  public ImageSource IconOverride { get; set; }
  public string TextOverride { get; set; }
  public ICommand Command { get; set; }
  public object CommandParameter { get; set; }
}

| API | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ์•„์ด์ฝ˜ ์žฌ์ •์˜ | ๋’ค๋กœ ๋ฒ„ํŠผ์— ์‚ฌ์šฉ๋˜๋Š” ์•„์ด์ฝ˜์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. |
| ํ…์ŠคํŠธ ์žฌ์ •์˜ | ํ…์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋’ค๋กœ ํƒ์ƒ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. |
| ๋ช…๋ น | ๋’ค๋กœ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ํ˜ธ์ถœํ•  ๋Œ€์ฒด ๋ช…๋ น์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. |
| ๋ช…๋ น ๋งค๊ฐœ๋ณ€์ˆ˜ | Command ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น ๋งค๊ฐœ๋ณ€์ˆ˜ |

ํ”Œ๋ผ์ด์•„์›ƒ๋””์Šคํ”Œ๋ ˆ์ด์˜ต์…˜

ShellGroupItem ๊ฐ€ FlyoutMenu์— ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  public enum FlyoutDisplayOptions
  {
    AsSingleItem,
    AsMultipleItems,
  }

| ๊ฐ€์น˜ | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| AsSingleItem | ShellGroupItem ์€ ํ”Œ๋ผ์ด์•„์›ƒ์—์„œ ๋‹จ์ผ ํ•ญ๋ชฉ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. |
| AsMultipleItems | ShellGroupItem ๋Š” ํ”Œ๋ผ์ด์•„์›ƒ์˜ ๊ฐ ํ•˜์œ„ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ํ•ญ๋ชฉ ๊ทธ๋ฃน์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. |

ํ”Œ๋ผ์ด์•„์›ƒํ—ค๋”๋™์ž‘

์Šคํฌ๋กคํ•  ๋•Œ FlyoutHeader์˜ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

public enum FlyoutHeaderBehavior {
  Default,
  Fixed,
  Scroll,
  CollapseOnScroll,
}

| ๊ฐ€์น˜ | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ๊ธฐ๋ณธ๊ฐ’ | ํ”Œ๋žซํผ ๊ธฐ๋ณธ ๋™์ž‘. |
| ๊ณ ์ • | ํ—ค๋”๋Š” ํ•ญ์ƒ ํ‘œ์‹œ๋˜๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. |
| ์Šคํฌ๋กค | ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”๋‰ด๋ฅผ ์Šคํฌ๋กคํ•  ๋•Œ ํ—ค๋”๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ฒŒ ์Šคํฌ๋กค๋จ |
| CollapseOnScroll | ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•  ๋•Œ๋งŒ ํ—ค๋”๊ฐ€ ์ œ๋ชฉ์œผ๋กœ ์ถ•์†Œ๋จ |

ํ”Œ๋ผ์ด์•„์›ƒ ๋™์ž‘

public enum FlyoutBehavior
{
  Disabled,
  Flyout,
  Locked
}

| ๊ฐ€์น˜ | ์„ค๋ช… |
| -----------| -------------------------------------------------- ------------------------------------------|
| ์žฅ์• ์ธ | ์‚ฌ์šฉ์ž๋Š” ํ”Œ๋ผ์ด์•„์›ƒ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. |
| ํ”Œ๋ผ์ด์•„์›ƒ | ํ”Œ๋ผ์ด์•„์›ƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์—ด๊ฑฐ๋‚˜ ๋‹ซ์„ ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ํ”Œ๋ผ์ด์•„์›ƒ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. |
| ์ž ๊น€ | ํ”Œ๋ผ์ด์•„์›ƒ์€ ์ž ๊ฒจ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ซ์„ ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ˜ํ…์ธ ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. |

๋ฐ์ดํ„ฐ ํ…œํ”Œ๋ฆฟ ํ™•์žฅ

์ด ํ™•์žฅ์€ ์œ ํ˜•์„ ControlTemplate์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…œํ”Œ๋ฆฟ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •๋˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

<ListView>
  <ListView.ItemTemplate>
    <DataTemplate>
      <local:MyCell />
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

์ด๊ฒƒ์€ ๋‹ค์Œ์œผ๋กœ ์••์ถ•๋  ์ˆ˜ ์žˆ๋‹ค.

<ListView ItemTemplate="{DataTemplate local:MyCell}" />
public sealed class ControlTemplateExtension : IBindingExtension<ControlTemplate>
public sealed class DataTemplateExtension : IBindingExtension<DataTemplate>

์žก๋™์‚ฌ๋‹ˆ

ํ‘ธ์‹œ๋œ ํ”Œ๋ผ์ด์•„์›ƒ์—์„œ ํƒญ์„ ์„ ํƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ํƒญ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  PopToRoot๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ShellItem์„ ์ „ํ™˜ํ•˜๊ณ  ์ด์ „ ShellItem์˜ ShellContent ๋ฐฑ์Šคํƒ์— ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

์ด์ „ ShellItem์ด ํ…œํ”Œ๋ฆฟํ™”๋œ ๊ฒฝ์šฐ ๋ฐฑ ์Šคํƒ์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ShellItem์ด ํ…œํ”Œ๋ฆฟํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ BackStack์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ณ  ์ด์ „ ShellItem์œผ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•  ๋•Œ ๋ฐฑ์Šคํƒ์ด ์ œ๋Œ€๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ „ํ™˜ํ•˜๋ฉด ์œ„์˜ ๋‹ต๋ณ€์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐฑ ์Šคํƒ์ด ์ง€์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํšจ์œจ์ ์ธ ํŽ˜์ด์ง€ ๋กœ๋”ฉ

์…ธ ์‚ฌ์šฉ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์‹œ์ž‘ํ•  ๋•Œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์ˆ˜์˜ ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ๋Œ€๊ทœ๋ชจ ํ”„๋ŸฐํŠธ๋กœ๋“œ ํ• ๋‹น์œผ๋กœ ์ธํ•ด ์‹œ์ž‘ ์„ฑ๋Šฅ์ด ์ƒ๋‹นํžˆ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๊ฐ€๋Šฅํ•œ ํ•œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟํ™”๋œ ShellContents

์…ธ ํƒญ ํ•ญ๋ชฉ ํ…œํ”Œ๋ฆฟ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ…œํ”Œ๋ฆฟ ์ค‘ ๊ฐ€์žฅ ์„ธ๋ถ„ํ™”๋œ ํ˜•ํƒœ์ด๋ฉฐ ๋‹คํ–‰ํžˆ๋„ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์‰˜์„ ๊ฐ€์ ธ ๊ฐ€๋ผ.

<?xml version="1.0" encoding="utf-8" ?>
<MaterialShell xmlns="http://xamarin.com/schemas/2014/forms"
               xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
               xmlns:local="clr-namespace:MyStore"
               x:Class="MyStore.Shell">

  <ShellItem Title="My apps &amp; games">
    <local:UpdatesPage />
    <local:InstalledPage />
    <local:LibraryPage />
  </ShellItem>

  <ShellItem GroupBehavior="ShowTabs">
    <local:HomePage />
    <local:GamesPage />
    <local:MoviesTVPage />
    <local:BooksPage />
    <local:MusicPage />
    <local:NewsstandPage />
  </ShellItem>
</MaterialShell>

์ด ์…ธ์ด ๋กœ๋“œ๋˜๋ฉด 9ํŽ˜์ด์ง€๊ฐ€ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="utf-8" ?>
<MaterialShell xmlns="http://xamarin.com/schemas/2014/forms"
               xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
               xmlns:local="clr-namespace:MyStore"
               x:Class="MyStore.Shell">

  <ShellItem Title="My apps &amp; games">
    <ShellContent Title="Updates"        Icon="updates.png" ContentTemplate="{DataTemplate local:UpdatesPage}" />
    <ShellContent Title="Installed Apps" Icon="apps.png"    ContentTemplate="{DataTemplate local:InstalledPage}" />
    <ShellContent Title="Library"        Icon="library.png" ContentTemplate="{DataTemplate local:LibraryPage}" />
  </ShellItem>

  <ShellItem GroupBehavior="ShowTabs">
    <ShellContent Title="Home"          Icon="updates.png"   ContentTemplate="{DataTemplate local:HomePage}" />
    <ShellContent Title="Games"         Icon="games.png"     ContentTemplate="{DataTemplate local:GamesPage}" />
    <ShellContent Title="Movies and TV" Icon="moviesTV.png"  ContentTemplate="{DataTemplate local:MoviesTVPage}" />
    <ShellContent Title="Books"         Icon="books.png"     ContentTemplate="{DataTemplate local:BooksPage}" />
    <ShellContent Title="Music"         Icon="music.png"     ContentTemplate="{DataTemplate local:MusicPage}" />
    <ShellContent Title="Newsstand"     Icon="newsstand.png" ContentTemplate="{DataTemplate local:NewsstandPage}" />
  </ShellItem>
</MaterialShell>

ํŽ˜์ด์ง€๋Š” ์ด์ œ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œ๋˜๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ์–ธ๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ShellItem ์ž์ฒด๋ฅผ ์ปฌ๋ ‰์…˜๊ณผ DataTemplateSelector๋กœ ํ…œํ”Œ๋ฆฟํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ShellContents๋„ ์—ด์‹ฌํžˆ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ShellContent ํ…œํ”Œ๋ฆฟ์€ ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ์˜์—ญ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Google Play ์Šคํ† ์–ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์žฌ๊ตฌ์„ฑ

์ด๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ฝ”๋”ฉํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์˜ ๋ฐ๋ชจ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ GPS์šฉ UI๋ฅผ ํ•จ๊ป˜ ๋ฐ€์–ด ๋„ฃ๋Š” ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•œ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ViewModel ๋ฐ DataTemplateSelector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ จ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ƒํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์•ฑ ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…์ž๋Š” ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ์ด๋Š” ํฌ๋กฌ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์…ธ.xaml

์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๊ตฌํ˜„์€ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ShellItems๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ItemsSource ๋ฐ ItemTemplate์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œ๋˜๊ณ  ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์–ธ๋กœ๋“œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="utf-8" ?>
<MaterialShell xmlns="http://xamarin.com/schemas/2014/forms"
               xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
               xmlns:local="clr-namespace:MyStore"
               x:Class="MyStore.Shell"
               FlyoutHeaderBehavior="Fixed"
               FlyoutHeader="{x:Bind HeaderViewModel}">
  <MaterialShell.FlyoutHeaderTemplate>
    <local:CircleImageAndLabelControl HeightRequest="350" />
  </MaterialShell.FlyoutHeaderTempalte>

  <ShellItem Title="My apps &amp; games">
    <ShellItem.ShellAppearance>
      <MaterialShellAppearance NavBarCollapseStyle="Full">
    </ShellItem.ShellAppearance>
    <local:UpdatesPage />
    <local:InstalledPage />
    <local:LibraryPage />
  </ShellItem>

  <local:NotificationsPage Title="My notifications" />

  <local:SubscriptionsPage />

  <ShellItem GroupBehavior="ShowTabs">
    <ShellItem.ShellAppearance>
      <MaterialShellAppearance NavBarCollapseStyle="Full" TabBarCollapseStyle="Full" UseSwipeGesture="false">
    </ShellItem.ShellAppearance>
    <local:HomePage />
    <local:GamesPage />
    <ShellContent Title="Movies &amp; TV" Icon="moviesTV.png" ContentTemplate="{DataTemplate local:MoviesTVPage}">
      <ShellContent.MenuItems>
        <MenuItem Title="Open Movies &amp; TV app" Command="{xBind MoviesTVAppCommand}" />
      </ShellContent.MenuItems>
    </ShellContent>
    <ShellContent Title="Books" Icon="books.png" ContentTemplate="{DataTemplate local:BooksPage}">
      <ShellContent.MenuItems>
        <MenuItem Title="Open Books app" Command="{xBind BooksAppCommand}" />
      </ShellContent.MenuItems>
    </ShellContent>
    <ShellContent Title="Music" Icon="music.png" ContentTemplate="{DataTemplate local:MusicPage}">
      <ShellContent.MenuItems>
        <MenuItem Title="Open Music app" Command="{xBind MusicAppCommand}" />
      </ShellContent.MenuItems>
    </ShellContent>
    <ShellContent Title="Newsstand" Icon="newsstand.png" ContentTemplate="{DataTemplate local:NewsstandPage}">
      <ShellContent.MenuItems>
        <MenuItem Title="Open Newsstand app" Command="{xBind NewsstandAppCommand}" />
      </ShellContent.MenuItems>
  </ShellItem>

  <local:AccountPage />

  <MenuItem Title="Redeem" Icon="redeem.png" Command="{x:Bind RedeemCommand}" />

  <local:WishlistPage />

  <MenuItem Title="Play Protect" Icon="protect.png" Command="{x:Bind NavigateCommand}" CommandParameter="ProtectPage" />

  <MenuItem Title="Settings" Icon="settings.png" Command="{x:Bind SettingsCommand}" CommandParameter="SettingsPage" />

  <MaterialShell.MenuItems>
    <MenuItem Title="Help &amp; feedback" Command="{x:Bind NavigateCommand}" CommandParameter="HelpPage" />
    <MenuItem Title="Parent Guide" Command="{x:Bind NavigateCommand}" CommandParameter="ParentPage" />
    <MenuItem Title="Help &amp; feedback" Command="{x:Bind UrlCommand}" CommandParameter="http://support.google.com/whatever" />
  </MaterialShell.MenuItems>
</MaterialShell>

์ƒ์  ํŽ˜์ด์ง€

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyStore"
             x:Class="MyStore.HomePage"
             Title="Home"
             Icon="home.png"
             ShellAppearance.BackgroundColor="Green">
  <Label Text="Home content here" />
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyStore"
             x:Class="MyStore.MoviesTVPage"
             Title="Movies &amp; TV"
             Icon="movies.png"
             ShellAppearance.BackgroundColor="Red">
  <Label Text="Movies and TV content here" />
</ContentPage>

๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰์ฐฝ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

public class HomePage : ContentPage
{
  public class HomeSearchHandler : SearchHandler
  {
    public HomeSearchHandler ()
    {
      SearchBoxVisibility = SearchBoxVisibility.Expanded;
      IsSearchEnabled = true;
      Placeholder = "Google Play";
      CancelPlaceholderIcon = "microphone.png"
    }

    protected override void OnSearchConfirmed (string query)

{      // Navigate to search results page here
    }

    protected override void OnSearchChanged (string oldValue, string newValue)
    {
    }

    protected override void OnCancelPlaceholderPressed ()
    {
      // Trigger voice API here
    }
  }

  public HomePage
  {
    Shell.SetSearchHandler (this, new HomeSearchHandler ());
  }  
}

์ƒ‰์ƒ๊ณผ ๋‚ด์šฉ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋’ค๋กœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๊นŒ์ง€ ํ”Œ๋ผ์ด์•„์›ƒ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ์„ค์ • ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyStore"
             x:Class="MyStore.SettingsPage"
             Title="Settings"
             Icon="settings.png"
             ShellAppearance.BackgroundColor="Grey"
             MaterialShell.FlyoutBehavior="Disabled">
  <Label Text="Settings content here" />
</ContentPage>

ํ•  ๊ฒƒ

  • [x] ๊ฒ€์ƒ‰ ์ƒ์ž์šฉ API ์ถ”๊ฐ€
  • [x] ContentSafeArea ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ API ์ถ”๊ฐ€
  • [x] ํ”Œ๋กœํŒ… ๋ฉ”๋‰ด์šฉ API ์ถ”๊ฐ€
  • [x] ์ฐฝ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ API ์ถ”๊ฐ€
  • [x] ์Šค๋‚ต๋ฐ”์šฉ API ์ถ”๊ฐ€
  • [x] ํƒ์ƒ‰ ์ค‘๋‹จ์„ ์œ„ํ•œ API ์ถ”๊ฐ€
  • [x] ํ•˜๋‹จ ์‹œํŠธ์šฉ API ์ถ”๊ฐ€
  • [x] ์œ„์น˜ FAB์— API ์ถ”๊ฐ€
  • [x] ํƒ์ƒ‰ ์•„์ด๋””์–ด๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์Šคํ† ๋ฆฌ ์ถ”๊ฐ€(์ผ๋ถ€ ์™„๋ฃŒ)
  • [x] LeftBarButton ์Šคํƒ€์ผ API ์ถ”๊ฐ€
  • [x] ShellContent์—์„œ ๋ฐฑ ์Šคํƒ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ถ”๊ฐ€
  • [x] ์„ ํƒํ•œ ํƒญ์— ๋”ฐ๋ผ ๋ฆฌ๋ณธ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” API ์ถ”๊ฐ€
  • [x] SearchHandler์— ๋Œ€ํ•œ ์„ ํƒ์  ์ œ์•ˆ ์ง€์› ์ถ”๊ฐ€
  • [x] ํ•ญ์ƒ ํ™•์žฅ๋œ ๊ฒ€์ƒ‰ ํ‘œ์‹œ์ค„๊ณผ ๊ฒ€์ƒ‰ ํ‘œ์‹œ์ค„์„ ์•„์ด์ฝ˜์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ง€์› ์ถ”๊ฐ€
  • [x] MaterialShell ํด๋ž˜์Šค์—์„œ "ํ˜„์žฌ" ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ API๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํƒ์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • [x] ๋ฐฑ ์Šคํƒ์— "์ƒํƒœ"๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ API ์ถ”๊ฐ€
  • [x] ํ”Œ๋ผ์ด์•„์›ƒ์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•˜๋Š” API ์ถ”๊ฐ€
  • [x] ShellContent์˜ ala GPS -> ์Œ์•… -> ์Œ์•… ์•ฑ ์—ด๊ธฐ์— ๋Œ€ํ•œ "ํ•˜์œ„ ๋ฉ”๋‰ด" ํ•ญ๋ชฉ์— ๋Œ€ํ•œ API ์ถ”๊ฐ€
  • [x] CancelPlaceholder ๋ช…๋ น ๋ฐ ์•„์ด์ฝ˜์šฉ API ์ถ”๊ฐ€(๋ณดํ†ต ์Œ์„ฑ ๊ฒ€์ƒ‰์šฉ ๋งˆ์ดํฌ ์•„์ด์ฝ˜์— ์‚ฌ์šฉ๋จ)
  • [x] ์„ธ๊ทธ API
  • [x] INavigation์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—… ์•Œ์•„๋ณด๊ธฐ
  • [ ] Google ์ง€๋„ ๊ธฐ๋Šฅ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•˜๋‹จ ์‹œํŠธ API ํ™•์žฅ
  • [x] ํ”Œ๋ผ์ด์•„์›ƒ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” API
  • [ ] ํ•„์š”ํ•  ๋•Œ ํ”Œ๋ผ์ด์•„์›ƒ ์ œ์Šค์ฒ˜๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” API
  • [ ] ํฐ ์ œ๋ชฉ API
  • [ ] ์ „ํ™˜ API

๋ฌธ์ œ

ISearchHandler [์ˆ˜์ •๋จ]

์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•˜๋Š” ์ผ์ด ๋งŽ๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํ™•์žฅํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถˆํ–‰ํ•œ ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด ํ• ๋‹น์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ–ฅํ›„์—๋„ ์œ ์—ฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

ํ”Œ๋กœํŒ… ๋ฉ”๋‰ด

์ฒจ๋ถ€ API๋Š” ์•ฝ๊ฐ„ ๋ฌด๊ฒ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์œ ๊ฒƒ์€ ์ฒจ๋ถ€ ํŒŒ์ผ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํ”Œ๋žซํผ์— ์ž˜ ๋งคํ•‘๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด API๋ฅผ ๊ฒ€์ฆํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

shell enhancement โž•

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

์—ฌ๋Ÿฌ๋ถ„, ์–ด์ œ Jason๊ณผ ์ €๋Š” ์ด ์‚ฌ์–‘์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ ๋Œ€๊ทœ๋ชจ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์˜ˆ์ •์ด๋ฉฐ ์ด๋ฅผ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์ธ ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ์„ ์ •๋ง ๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋Œ€ํ™”๋ฅผ ํฅ๊ฒน๊ฒŒ ํ•ฉ์‹œ๋‹ค!

๋จผ์ €, @jassmith ์—๊ฒŒ ์ด๊ฒƒ์„ ํฌ์ฐฉํ•˜๊ณ  ๊ณต๊ฐœ ํ† ๋ก ์„ ์œ„ํ•œ ์ œ์•ˆ์„œ๋ฅผ

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

์ด ์ œ์•ˆ์—์„œ ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ œ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ์ด์•ผ๊ธฐํ•ด ์™”์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š” ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ €๋„ ์˜ˆ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Shell ๊ฐœ๋…๊ณผ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์ƒ๊ฐ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ฑ ๊ฒฝํ—˜

์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑ๋œ ์™„์ „ํ•œ ์•ฑ ๊ฒฝํ—˜์„ ์–ป์œผ๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„์ฃผ ์ ์€ ๋…ธ๋ ฅ๊ณผ ๋ช…ํ™•ํ•œ ๊ฒฝ๋กœ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ…Œ๋งˆ๊ฐ€ ์žˆ๋Š” ์•ฑ
  • ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ(์ด ๊ฒฝ์šฐ) ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ„ด ์ผœ์ง
  • ๊ตฌ์„ฑ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ์ตœ์‹  ํƒ์ƒ‰ ํŒจํ„ด
  • iOS, Android ๋ฐ UWP์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ•ญ๋ชฉ ๋˜๋Š” ๋ฒ„ํŠผ์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?

์ •ํ™•ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ•์กฐํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

App ๋Œ€์‹  MaterialShell ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ ์„ ์–ป์œผ๋ ค๋ฉด ์ƒˆ๋กœ์šด ์ตœ์ƒ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ•™์Šต/์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด ์•ฑ์— ๋“ค์–ด๊ฐ€๋ฉด ContentPage ๋•…์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋งž์ฃ ? ํ•˜์ง€๋งŒ ๋‚ด Button ์™€ Entry ๋Š” ๋ชจ๋‘ ๋ฌผ์งˆ์ ์ด๊ณ  ์˜ˆ์˜๋‹ค. ์—ฌ์ „ํžˆ OnPlatform ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธฐ์กด ์•ฑ์—์„œ ์ด "์‰˜"์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์ƒˆ๋กœ์šด MaterialShell ์†Œ๊ฐœํ•˜๊ณ , ๋‚ด ์•ฑ์˜ ๊ตฌ์กฐ์™€ ๋ชจ์–‘์„ ์„ค๋ช…ํ•˜๊ณ , ์ƒˆ๋กœ์šด ์žฅ์ ์„ ๋ณด๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ„ฐ๋งˆ์ด์ง•

Flyout ๋˜๋Š” ๋ฉ”๋‰ด ํ•ญ๋ชฉ ๋ชจ์–‘์ด ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ๋””์ž์ด๋„ˆ ๊ตฌ์„ฑ ์š”์†Œ์— ๋งž๊ฒŒ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์–ด๋Š ์‹œ์ ์—์„œ "์ด ๋ชจ๋“  ๊ฒƒ์„ ์Šค์Šค๋กœ ๋กค๋งํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค"๊ณ  ๋งํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ‘œ์ค€ Xamarin.Forms ์•ฑ ๊ตฌ์กฐ๋กœ ์˜ฎ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

MaterialShell ๋ฅผ ์™„์ „ํžˆ ํฌ๊ธฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์Šคํƒ€์ผ๋ง์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์žƒ๊ณ  iOS์™€ Android ๋ฐ UWP ๊ฐ„์— ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋Š” Entry ์‹œ์ž‘ํ–ˆ๋˜ (์˜ค๋Š˜์ฒ˜๋Ÿผ) ๋‹ค์‹œ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ? ํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ์ „ํ™˜์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์— ๋„๋‹ฌํ•˜๊ณ  ๋‚ด ์˜ต์…˜์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ค ์‹œ์ ์—์„œ MaterialShell ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ

์ฝ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ํ•˜๋ฉฐ ์ด ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ด ์ œ์•ˆ์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๊ฐ€ ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๊ณต์œ ํ•˜๋Š” ๋ฌธ์ œ์ธ๊ฐ€์š”?
  • ์ด ์‚ฌ์–‘์„ ์ฝ์œผ๋ฉด์„œ ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ ์ง๋ฉดํ•œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์Šคํฌ๋ฆฐ์ƒท/๋””์ž์ธ ์ด๋ฏธ์ง€๊ฐ€ ๋” ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

http://www.noesisengine.com/webgl/Samples.Buttons.html

@jassmith ์ „์ฒด์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์ด๋ฏธ์ง€๋กœ

๋‚ด ์ฟผ๋ฆฌ๋Š”

  • ํƒœ๋ธ”๋ฆฟ ์ง€์›, ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์— ์ ์‘ํ•˜๋Š” ์•ฑ์˜ ์‘๋‹ต์„ฑ์€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋ชจ๋ธ์—์„œ ์ƒˆ ๋ชจ๋ธ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์–ด๋ ค์šธ๊นŒ์š”? ์•ฑ ๊ฐœ๋ฐœ์ž ๊ด€์  ๋ฐ Xamarin Forms ๊ธฐ์—ฌ์ž ๊ด€์ ์—์„œ.
  • ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์ด ํ”Œ๋žซํผ ํŠน์„ฑ์„ ์กด์ค‘ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ผ UI(๋™์ผํ•œ UI ๊ฐœ๋…์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์  ๊ฐ€๋Š” ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ์˜ ์–‘ ๋•Œ๋ฌธ์—)๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋žซํผ๋ณ„ UI๊ฐ€ ์žˆ๋Š” ์•ฑ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ƒˆ๋กœ์šด ํ‘œ์ค€์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • MaterialShell ๋‚ด๋ถ€์— ๋ Œ๋”๋Ÿฌ ๊ฐœ๋…์ด ๊ณ„์† ์กด์žฌํ•ฉ๋‹ˆ๊นŒ?
  • ์‹ค์ œ๋กœ iOS์—์„œ ์ด๊ฒƒ์ด ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ Œ๋”๋ง๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Flutter์—๋Š” Android์—์„œ ์ž‘๋™ํ•˜๋Š” Cupertino Styles(apple UI)์™€ iOS์—์„œ ์ž‘๋™ํ•˜๋Š” Android UI๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Xamarin Forms๋Š” ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ง€๊ธˆ flutter๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—๋Š” ๋ถ€๋™ ๋ ˆ์ด๋ธ”/์ž๋ฆฌ ํ‘œ์‹œ์ž ๋ฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์›ํ•˜๋Š” TextInputLayout๊ณผ ์œ ์‚ฌํ•œ ํ•ญ๋ชฉ๋„ ํฌํ•จ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด wpf์™€ ์œ ์‚ฌํ•œ 'ValidateOnDataErrors'๋ฅผ ํฌํ•จํ•˜๋„๋ก Binding ๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋‚ด ๊ตฌํ˜„์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://github.com/XamFormsExtended/Xfx.Controls/blob/develop/src/Xfx.Controls/XfxBinding.cs

๋˜ํ•œ MaterialShell์ด โ€‹โ€‹Shell์„ ํ™•์žฅํ•˜์—ฌ iOS ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์„ ์œ„ํ•œ HumanInterfaceShell์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@ChaseFlorell ๊ทธ๊ฒƒ๋„ ๋‚ด ์˜๊ฒฌ์ด ๋  ์˜ˆ์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์งˆ์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ํŠน์ • UI ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ž์ฒด ์‰˜์„ ์ž‘์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@davidortinau , @jassmith ,

์ด ์‚ฌ์–‘์„ ์ž‘์„ฑํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๊ฐ€ ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ. ํƒ์ƒ‰ ์‹œ์Šคํ…œ์€ Xamarin Forms์—์„œ ์™„์ „ํžˆ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฅผ ์™„๋ฃŒํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐœ๋ฐฉํ˜• ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ ํ•˜๋Š” ๋ฌธ์ œ์ธ๊ฐ€์š”?

์˜ˆ.

์ด ์‚ฌ์–‘์„ ์ฝ์œผ๋ฉด์„œ ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ ์ง๋ฉดํ•œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•จ์œผ๋กœ์จ ์ด ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ํŠน๋ณ„ํ•œ ๋ฌธ์ œ๋Š” ํ˜„์žฌ์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์‹œ์Šคํ…œ์ด ๋„ˆ๋ฌด ๋‹จ๋‹จํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด์ง€ ์ถฉ๋ถ„ํžˆ ๋‹จ๋‹จํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ช…ํ™•ํ•œ ์˜ˆ๋Š” TabbedPage์ž…๋‹ˆ๋‹ค. TabbedView ๋ณด๊ธฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์•ฑ์— ํƒญ์ด ํ•„์š”ํ•˜๋ฉด TabbedPage๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒด ํ™”๋ฉด์€ TabbedPage๊ฐ€ ์ฐจ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ ์ž์ฒด ๋ฒ„ํŠผ์ด๋‚˜ ํ™”๋ฉด์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ปจํŠธ๋กค์— ๋Œ€ํ•œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ํŽ˜์ด์ง€์˜ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ƒ์œ„ ๊ณ„์ธต์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํŽ˜์ด์ง€ _๋ฐ–_์œผ๋กœ ์ด๋™ํ•˜๊ณ  ๋ณด๊ธฐ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

FloatingMenu ๋ฐ FlyoutBehavior์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์€ ํƒ์ƒ‰์ด Xamarin.Forms ์‹œ์Šคํ…œ์— ์ถ”๊ฐ€๋กœ ํ•˜๋“œ ์ฝ”๋”ฉ๋˜๊ณ  ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ถ”๊ฐ€ ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ์„ ์•”์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €๋ฅผ ๋‘๋ ต๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ข€ ๋” ํ‘œ์ค€ํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ด๋Š ์ •๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์‹คํžˆ ๋น„์šฉ์ด ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ Silverlight, WPF ๋ฐ UWP์™€ ๊ฐ™์€ ๋‹ค๋ฅธ XAML ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์—์„œ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์—์„œ๋Š” ํƒ์ƒ‰ ์ž‘๋™ ๋ฐฉ์‹์„ ๋” ๋งŽ์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ›จ์”ฌ ๋” ๊ฐœ๋ฐฉ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” UI/UX ์ปจ์„คํ„ดํŠธ๋ฅผ ๊ณ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” XF์˜ ๋‹จ์ ์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ์—๊ฒŒ ์šฐ๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ ์ถ”์ฒœํ•œ ๋งŽ์€ ๋ถ€๋ถ„์€ TabbedView๊ฐ€ ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํƒ์ƒ‰์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์‹ค์ œ๋กœ UX/UI ๋””์ž์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•œ ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

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

@dylanberry ,

ํŠน์ • UI ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ž์ฒด ์‰˜์„ ์ž‘์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์˜ˆ. ์ด๊ฒƒ์ด ์ œ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. ๊ฐ ์•ฑ์—๋Š” ๊ณ ์œ ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋” ์—„๊ฒฉํ•ด์งˆ์ˆ˜๋ก ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/xamarin/Xamarin.Forms/issues/2452#issuecomment -380991817

๋‚˜๋Š” ์œ„์˜ ๋‚ด์šฉ์„ ๋˜ํ’€์ดํ•˜๊ณ  ์ œ์Šค์ฒ˜์™€ ํฌ์ธํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ irt ๋ชจ์–‘ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ ๋ฌผ์–ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์˜๊ฒฌ์€ ์‹œ์Šคํ…œ์— ์ถ”๊ฐ€๋œ ๋ชจ๋“  ์ฝ”๋“œ ํ–‰์— ๋Œ€ํ•ด ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฐ€๋Šฅ์„ฑ์ด 3๋ฒˆ ์ด์ƒ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Xamarin Forms์—๋Š” ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์ด๋ฏธ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฒ„๊ทธ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. XF ํŒ€์€ ์ฝ”๋“œ ๋ฒ ์ด์Šค์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ๋ณด๋‹ค๋Š” ์ค„์ด๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ์ค„์ด๋Š” ๊ฒƒ์ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋จผ์ € ๋ชจ๋“  ๊ฒƒ์ด ๊ฒฌ๊ณ ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋‹ค์‹œ ๋ฐœ๋ช…ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ €์—๊ฒŒ ๊ทธ๊ฒƒ์€ ๊ฐ๋™๋ฐ›์•˜์ง€๋งŒ ํƒ์ƒ‰์€ Xamarin Forms์˜ ๊ฐ€์žฅ ํฐ ๊ฑธ๋ฆผ๋Œ์ด๋ฉฐ ์ง€๋‚œ 3๋…„ ๋™์•ˆ ์ €์—๊ฒŒ ๊ฐ€์žฅ ํฐ ๊ณ ํ†ต์„ ์•ˆ๊ฒจ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

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

  • ์ด์ƒ์ ์œผ๋กœ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž์‹ ์˜ ContentView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ ๋ชจ์Œ์˜ ๋‚ด์šฉ์„ ์„ ํƒ ํ•ด์ œํ•˜๊ณ  ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PlatformSpecifics๋Š” ์›๋ž˜ ๋„๊ตฌ ๋ชจ์Œ ํ•ญ๋ชฉ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋…ผ์˜๋˜์—ˆ์ง€๋งŒ(Bryan๊ณผ ์ด์•ผ๊ธฐํ•  ๋•Œ) ์ œํ•œ๋œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ํŽ˜์ด์ง€ ํŒ์—… ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ ํ•ญ๋ชฉ์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ

์ œ์•ˆ๋œ ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋งค์šฐ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํŠน์ • ํŽ˜์ด์ง€์—์„œ ๋จธํ‹ฐ๋ฆฌ์–ผ ์…ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์•ฑ ์ „์ฒด์— ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํ•œ ์ฝ”๋“œ๋Š” ์ •๋ง ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” UX ๋‹ด๋‹น์ž์—๊ฒŒ "Xamarin Forms์˜ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๊ณ„์†ํ•ด์„œ ๋งํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํžˆ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด์ „ ์—ญํ• ์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ). ๊ฐํžˆ ๋งํ•˜์ง€๋งŒ, ์ด์ „์— Forms ์•ฑ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•œ UX ๊ด€์ ์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. XamlC์ฒ˜๋Ÿผ ์˜ตํŠธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„์€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ FlexShell์ด โ€‹โ€‹๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค...ํ•˜์ง€๋งŒ ์ด์ œ Flexbox๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๊ฒƒ์€ ํ…Œ๋งˆ๊ฐ€ ์ฃฝ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์–ด์จŒ๋“  ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@๋งฅ์ผ€์ธ

ํ˜„์žฌ๋กœ์„œ๋Š” UX ๋‹ด๋‹น์ž์—๊ฒŒ "Xamarin Forms์˜ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๊ณ„์†ํ•ด์„œ ๋งํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํžˆ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด์ „ ์—ญํ• ์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ).

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฒ„๊ทธ์™€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ๋Š” ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ตฌํ˜„์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ํ˜„์žฌ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

MaterialShell์€ ์–ด๋–ค ์ ์—์„œ ๋…๋‹จ์ ์ธ API์ž…๋‹ˆ๋‹ค."

์ง„์ง€ํ•˜๊ฒŒ, Xamarin Forms๋Š” ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? XF ํŒ€์€ ์ตœ์†Œํ•œ Android ๋ฐ iOS์— ๋Œ€ํ•œ ํ˜„์žฌ XF ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ„์‹ ํžˆ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„๊ทธ ์ˆ˜์ •, XAML ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ์ˆ˜์ •, ์„ฑ๋Šฅ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์†”๋ฆฌ๋“œ ๋ฐ ๊ทธ๋ผ๋””์–ธํŠธ ๋ธŒ๋Ÿฌ์‹œ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ํ›จ์”ฌ ์œ ์šฉํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜์ž๋Š” ์ œ์•ˆ์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ œ์•ˆํ•œ ํ‹ฐ์ผ“์ด ์žˆ์—ˆ์ง€๋งŒ @jassmith์˜ ์‘๋‹ต์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ ์ด ํ‹ฐ์ผ“์€ ๊ฐ™์€ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.... ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆผ์„ ์ด๋™

@opcodewriter

์˜ˆ, ์˜ˆ๋ฅผ ๋“ค์–ด Prism ํŒ€์„ ๋ฐฉํ•ดํ•˜๋Š” ํƒ์ƒ‰ ์ด์ƒ ํ˜„์ƒ์ด ์ž‘๋…„์— ์žˆ์—ˆ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๊ฑด์„ค์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. Xamarin Forms๋Š” ์ง„ํ™”์˜ ์ค‘์š”ํ•œ ์‹œ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด API๋Š” ์•ฑ ์ „์ฒด์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋‹Œ ์œ ์—ฐํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ฒฝ์šฐ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jassmith ๋Š” XF๊ฐ€ Shell์— ๋Œ€ํ•ด Flutter ์ ‘๊ทผ ๋ฐฉ์‹(๋„ค์ดํ‹ฐ๋ธŒ ์ปจํŠธ๋กค ๋Œ€์‹  ๋ Œ๋”๋ง ์—”์ง„ ์‚ฌ์šฉ)์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ๋ถ„, ์–ด์ œ Jason๊ณผ ์ €๋Š” ์ด ์‚ฌ์–‘์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ ๋Œ€๊ทœ๋ชจ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์˜ˆ์ •์ด๋ฉฐ ์ด๋ฅผ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๊ฐ์ • ์ค‘ ์ผ๋ถ€๋ฅผ ๋˜ํ’€์ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฌดํ•œํ•œ ์ž์›์ด ์—†๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์„ ๊ฐœ์„ ํ•ฉ์‹œ๋‹ค.

ListView ์ˆ˜์ •(์•„์ง๋„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ฏฟ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค), CheckBox, RadioButton๊ณผ ๊ฐ™์€ ์ปจํŠธ๋กค ๊ตฌํ˜„, ๋ธŒ๋Ÿฌ์‹œ ์ง€์› ๊ตฌํ˜„(SolidColorBrush, GradientBrush), ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ํŒ์—… ํ‘œ์‹œ ๊ธฐ๋Šฅ ๋˜๋Š” ContentView, ๋ฒ„๊ทธ ์ˆ˜์ •(ํˆฌ๋ช…ํ•œ ๋ณด๊ธฐ์— ๋Œ€ํ•ด ๋ณด๊ณ ๋œ ์ตœ๊ทผ ๋ฒ„๊ทธ ์ฐธ์กฐ), ์„ฑ๋Šฅ, ๋„๊ตฌ ๋“ฑ....

์™œ ์ƒˆ๋กœ์šด ์ผ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?????

@TonyHenrique ์˜ˆ ์‚ฌ์ง„์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ์˜ˆ์ˆ ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋‚ด๊ฐ€ ์ฐธ์กฐ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๊ถŒ๋ฆฌ๋ฅผ ์†Œ์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋””์ž์ธ ํŒ€ ๊ตฌ์„ฑ์›์ด ์‚ฌ์–‘์— ์ ํ•ฉํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์‹œ๊ฐ„์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@muham

  • ํƒœ๋ธ”๋ฆฟ ์ง€์›. ๋ ˆ์ด์•„์›ƒ์ด ํƒœ๋ธ”๋ฆฟ์— ๋งž๊ฒŒ ์กฐ์ •๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€ ๋‚ด๋ถ€ ์— ๋ ˆ์ด์•„์›ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋Œ€์ฒด๋กœ ๋‚˜๋Š” ์ƒˆ๋กœ์šด VSM์œผ๋กœ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„ ContentPages๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๊ณ  ์ƒˆ๋กœ์šด ํƒ์ƒ‰ ๊ฐœ๋…์— ์ ์‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•ญ์ƒ ์‚ฌ์†Œํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์‡ ์•ฝํ•˜๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ์–ด๋–ค ๊ธฐ๋Šฅ๋„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ €๋Š” MaterialShell์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ๋†“์น˜๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Shell์˜ ํ”Œ๋žซํผ๋ณ„ UI ๋ฒ„์ „์ธ Shell ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋„๋ก ์‚ฌ์–‘์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ. ๋“œ๋กœ์ž‰์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋“œ๋กœ์ž‰์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š” ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ. ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ Œ๋”๋Ÿฌ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ๋Š” ๋ฆฌ์†Œ์Šค ์‚ฌ์ „์˜ ํŠน์ˆ˜ ํ‚ค๋กœ ์„ค์ •๋˜๋Š” ํ…œํ”Œ๋ฆฟ์— ์˜ํ•ด ๋ณ€๊ฒฝ๋  ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ null์„ ์„ค์ •ํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ChaseFlorell ์•„๋‹ˆ์š”, ํ•˜์ง€๋งŒ ์‚ฌ์–‘์— ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฒจ๋ถ€ํ•˜๋ ค๋ฉด ์ œ์•ˆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Shell ๋Œ€ MaterialShell์— ๊ด€ํ•ด์„œ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 1๋‹จ๊ณ„๋Š” MaterialShell์ด โ€‹โ€‹์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋‹ค์Œ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด 2๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

@dylanberry ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DrawingTemplates๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํ”Œ๋žซํผ๋ณ„ ์ฝ”๋“œ์—์„œ ์ด๊ฒƒ์˜ MaterialShell ์ธก๋ฉด์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

@RichiCoder1 ์ œ์Šค์ฒ˜๊ฐ€ ์—ฌ๊ธฐ์— ์˜ฌ ๊ฒƒ์ด์ง€๋งŒ ์š”์ ์€ ํ•˜์œ„ ์˜์—ญ ์ œ์Šค์ฒ˜๊ฐ€ ์žˆ๋Š” ๋ณด๊ธฐ๊ฐ€ CommandableSpan API์˜ ์ผ๋ถ€๋กœ ์ œ๊ณต๋˜๊ณ  ์ œ์Šค์ฒ˜๊ฐ€ ์žˆ๋Š” ๊ทธ๋ฆผ๋„ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๋ฐฑ์—”๋“œ๊ฐ€ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ˜„์žฌ ์ด ์‹œ์ ์—์„œ MaterialShell ์‚ฌ์–‘๊ณผ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” Drawing ์‚ฌ์–‘์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๊ธธ๊ณ  ์งง์€ ๊ฒƒ์€ DrawingTemplate์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋ Œ๋”๋Ÿฌ๊ฐ€ ์Šฌ๋ผ์ด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ๊ธฐ๋ณธ ๋ฐฑ์—”๋“œ์—์„œ ์ž…๋ ฅ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์† ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋„๋ฉด์ด ์žˆ๋Š” SliderDrawingTemplate์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ Œ๋”๋Ÿฌ๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์„ ํƒ ์‚ฌํ•ญ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mackayn a Transitions/Segue API๊ฐ€ ๊ณง ์ถœ์‹œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ์ดˆ๊ธฐ ์ œ์•ˆ์„œ์˜ ์ด๋ฆ„์„ ์ง“๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํŽ˜์ด์ง€ ์ „ํ™˜๋งŒ ๋‹จ๊ณ„ 1์— ์žˆ๋Š” ๋‹จ๊ณ„์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ตํŠธ์ธ์— ๊ด€ํ•ด์„œ. ์…ธ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฃจํŠธ์—ฌ์•ผ ํ•˜๋ฉฐ TemplatedPage ์™ธ์—๋Š” ์ค‘์ฒฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด๋ถ€ ํ†ต์ œ ํ…Œ๋งˆ๋Š” 100% ํ†ต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ํ…œํ”Œ๋ฆฟ์„ ์ผœ๊ณ  ๋„๋Š” ๋งˆ๋ฒ•์˜ ์Šค์œ„์น˜์— ๋ถˆ๊ณผํ•˜๋ฉฐ ์šฐ๋ฆฌ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•ด๋‹น ์Šค์œ„์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€, ๋ ˆ์ด์•„์›ƒ ๋˜๋Š” ์ œ์–ด ์ˆ˜์ค€์—์„œ ํ…Œ๋งˆ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์„ ํƒ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@encrypt0r ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ํ›„๋“œ ์•„๋ž˜์—์„œ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ๋ณ„ ์ปจํŠธ๋กค์ด ๋“œ๋กœ์ž‰ ์ฝ”๋“œ๋กœ ํ…Œ๋งˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” Ski์— ํƒˆ์ถœ์šฉ ํ•ด์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(v1 ๊ทผ์ฒ˜์—์„œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ๊ธด ํ•˜์ง€๋งŒ).

@opcodewriter ListView2(์‹ค์ œ๋กœ ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€๋Š” ์•Š์Œ)๋Š” ๋งˆ์นจ๋‚ด ์˜ฌํ•ด ๋กœ๋“œ๋งต์— ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ์ƒˆ๋กœ์šด ListView์ธ๊ฐ€? ์›๋ž˜ API๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์™„์ „ํžˆ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ํšจ๊ณผ์ ์œผ๋กœ ๊ณ ์น  ์ˆ˜ ์—†๋Š” ๊ฑฐ์˜ ๋ฌดํ•œํ•œ ์ˆ˜์˜ ๋ฒ„๊ทธ์™€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. Cell/ViewCell ๋ฐ ItemsView์™€ ๊ฐ™์€ ๊ฒƒ๊ทธ๋ฆฌ๊ณ  TemplatedItemsList๋Š” 1.0์—์„œ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ API์˜ ํ˜„๋Œ€์ ์ธ ์‚ฌ์šฉ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ฑฐ์˜ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ListView ์œ ํ˜• ์ž์ฒด ๋‚ด์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์œผ๋ฉฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋„ ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ตœ์„ ์˜ ์„ ํƒ์€ ListView๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ๋‹ค์Œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๊ณ  ๋ถ€๊ธฐ์žฅ์ด ์ ์œผ๋ฉฐ ์กด์žฌํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋œ ์ด์ƒํ•œ ์œ ํ˜•์œผ๋กœ ํ›จ์”ฌ ๋” ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋Œ€์ƒ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ตœ์„ ์„ ๋‹คํ•˜๋Š” ๊ฒƒ์„ ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ๊ฑฐ๋Œ€ํ•œ backcompat ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋  ์ด์ „ ์žฌํ™œ์šฉ ์ „๋žต์„ ์ œ๊ฑฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด Xamarin.Forms ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ƒ๋‹นํ•œ ๋ถ€๋ถ„์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ListView2๋Š” ๊ฐ€๋“œ๋ ˆ์ผ(๋˜๋Š” Cell์˜ ๊ฒฝ์šฐ 2๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋‚ด๋ถ€ ํ”„๋กœ์ ํŠธ์˜ ๋ถ€์ •ํ•œ ํ•ฉ๋ณ‘)์ด ๋˜๋„๋ก ์˜๋„๋œ ์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ๊ธˆ์†์— ํ›จ์”ฌ ๋” ๊ฐ€๊นŒ์ด ๋‹ค๊ฐ€๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ ์ด์ œ๋Š” ๋ชจ๋‘์—๊ฒŒ ํ”ผํ•ด๋ฅผ ์ค๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ์บ์‹ฑ ์ „๋žต์€ ์˜ค๋Š˜๋‚  ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ Œ๋”๋Ÿฌ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ Œ๋”๋Ÿฌ๊ฐ€ ์š”์†Œ ๋ณ€๊ฒฝ์„ ์ง€์›ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚˜์˜ ์ตœ์„ ์˜ ์ถ”์ •์— ์˜ํ•ด ์‚ฌ๋ผ์ง€๋ฉด ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” ๋ชจ๋“  ์ฝ”๋“œ์˜ ์•ฝ 10%๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ •๋ง ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์žฅ ํฐ ์•”์ž…๋‹ˆ๋‹ค.

@davidortinau ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ๋„ˆ๋ฌด ๋ฉ‹์ง„ ํ˜•์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ…Œ๋งˆ๊ฐ€ ์žˆ๋Š” ์•ฑ
  • ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ(์ด ๊ฒฝ์šฐ) ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ„ด ์ผœ์ง
  • ๊ตฌ์„ฑ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ์ตœ์‹  ํƒ์ƒ‰ ํŒจํ„ด
  • iOS, Android ๋ฐ UWP์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ•ญ๋ชฉ ๋˜๋Š” ๋ฒ„ํŠผ์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?

์ •ํ™•ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ•์กฐํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋„ค ๋งž์Šต๋‹ˆ๋‹ค. ๊ฐ•์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ด์ ์ด ๋งŽ์ด ์žˆ์ง€๋งŒ ์ผ๋‹จ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค. ํ•˜๋‹จ ์‹œํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ FAB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  URL์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰(์—…๋ฐ์ดํŠธ ์˜ˆ์ •) ๋“ฑ โ€‹โ€‹ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ ๋Œ€์‹  MaterialShell์ด โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ ์„ ์–ป์œผ๋ ค๋ฉด ์ƒˆ๋กœ์šด ์ตœ์ƒ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ•™์Šต/์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ž˜๋ชป๋œ. ์•ฑ MainPage๋Š” MaterialShell์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์•ฑ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค.

๋‚ด ์•ฑ์— ๋“ค์–ด๊ฐ€๋ฉด ContentPage ๋žœ๋“œ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๋ชจ๋“  ๋ฒ„ํŠผ๊ณผ ํ•ญ๋ชฉ์€ ๋ฌผ์งˆ์ ์ด๋ฉฐ ์•„๋ฆ„๋‹ต์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ํ‹€๋ฆฐ ๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋งž์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ OnPlatform ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ์–‘(๋˜๋Š” ๋™์ž‘)์„ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ.

๊ธฐ์กด ์•ฑ์—์„œ ์ด "์‰˜"์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

Google Play ์Šคํ† ์–ด ์žฌํ˜„ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๋ชจ๋“  ์•ฑ์˜ ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๊ฑฐ๊ธฐ์— ๋„ฃ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์ด๊ฒƒ์€ ์•ฑ์—์„œ Nav/Tab/MD ํŽ˜์ด์ง€๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ๋งŒ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ContentPages์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด MaterialShell์„ ์†Œ๊ฐœํ•˜๊ณ  ์•ฑ์˜ ๊ตฌ์กฐ์™€ ๋ชจ์–‘์„ ์„ค๋ช…ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์žฅ์ ์„ ๋ณด๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋น™๊ณ 

ํ”Œ๋ผ์ด์•„์›ƒ ๋˜๋Š” ๋ฉ”๋‰ด ํ•ญ๋ชฉ์˜ ๋ชจ์–‘์ด ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ๋””์ž์ด๋„ˆ ๊ตฌ์„ฑ ์š”์†Œ์— ๋งž๊ฒŒ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ—ค๋”, ํ—ค๋” ์ถ•์†Œ ๋ฐ ์ˆจ๊ธฐ๊ธฐ ๋ฐฉ๋ฒ•์„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ผ์ด์•„์›ƒ์—์„œ ๊ฐ "์…€"(์…€์ด ์•„๋‹˜)์˜ ๋ชจ์–‘/๋Š๋‚Œ์„ ์™„์ „ํžˆ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ๊ฐ ๊ทธ๋ฃน์˜ ํ—ค๋”๋„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ ๋ชจ๋“  ๊ฒƒ์˜ "๋ชจ์–‘"์„ ์ œ์–ดํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š ์‹œ์ ์—์„œ "์ด ๋ชจ๋“  ๊ฒƒ์„ ์Šค์Šค๋กœ ๋กค๋งํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค"๊ณ  ๋งํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ‘œ์ค€ Xamarin.Forms ์•ฑ ๊ตฌ์กฐ๋กœ ์˜ฎ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

Google Play ์Šคํ† ์–ด ๋ฌผ๋ฆฌ์  ๋ ˆ์ด์•„์›ƒ ํ”Œ๋ผ์ด์•„์›ƒ์ด ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋Š” ๊ฒฝ์šฐ. ์•ฝ๊ฐ„ ๋‹ค๋ฅด์ง€ ์•Š๊ณ  ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

MaterialShell์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์Šคํƒ€์ผ ์ง€์ •์„ ๋ชจ๋‘ ์žƒ๊ฒŒ ๋˜๋ฉฐ iOS์™€ Android ๋ฐ UWP ๊ฐ„์— ์ƒ๋‹นํžˆ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ๋ณด๊ณ  ์‹œ์ž‘ํ–ˆ๋˜ ๊ณณ(์˜ค๋Š˜์ฒ˜๋Ÿผ)์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๊นŒ? ํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

No MaterialShell์€ ์ž์‹์ด ๊ฐ€์ ธ์˜ค๋„๋ก ์ผ๋ถ€ ๊ธฐ๋ณธ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šค์Šค๋กœ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ MaterialShell์ด โ€‹โ€‹๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋„๋ก ์•ฝ์†ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์˜ตํŠธ์•„์›ƒ ๋Œ€์‹  ์˜ตํŠธ์ธ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ํ•˜์œ„ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ๋‹จ์ผ API ํ˜ธ์ถœ์ด ๋ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ์ „ํ™˜์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์— ๋„๋‹ฌํ•˜๊ณ  ๋‚ด ์˜ต์…˜์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ค ์‹œ์ ์—์„œ MaterialShell์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

์˜๋„๋Š” ์‰˜์ด ์•„๋‹Œ ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Material์„ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ•ญ์ƒ Shell์„ ์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‹ค์‹œ Shell ๊ธฐ๋ณธ ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค). ์™œ์š”? ์…ธ์˜ ๋ชจ์–‘/๋Š๋‚Œ์„ ํ›จ์”ฌ ๋” ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ํƒ์ƒ‰ ์Šคํ† ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๋” ํ†ตํ•ฉ๋˜๋ฉฐ ์…ธ์—์„œ ํ•  ์ˆ˜ ์—†๋Š” ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ƒ์ ์ธ ์ผ์€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์™œ ์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ์— ๊ทธ๊ฒƒ์„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ์ดˆ์ฐฝ๊ธฐ์—๋Š” ๋””์ž์ธ ๋ชฉํ‘œ๊ฐ€ ์•„๋‹ˆ์—ˆ๊ณ  ๊ฒฐ๊ตญ ๊ฒฐํ˜ผํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค... ์ด๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ํฌ๊ณ  ์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ์‹ค์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@opcodewriter

์ง„์ง€ํ•˜๊ฒŒ, Xamarin Forms๋Š” ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? XF ํŒ€์€ ์ตœ์†Œํ•œ Android ๋ฐ iOS์— ๋Œ€ํ•œ ํ˜„์žฌ XF ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ„์‹ ํžˆ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ ์ˆ˜์ •, XAML ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ์ˆ˜์ •, ์„ฑ๋Šฅ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

^^ ์ด

@migueldeicaza

์—ฌ๋Ÿฌ๋ถ„, ์–ด์ œ Jason๊ณผ ์ €๋Š” ์ด ์‚ฌ์–‘์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ ๋Œ€๊ทœ๋ชจ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์˜ˆ์ •์ด๋ฉฐ ์ด๋ฅผ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Miguel, ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ํฐ ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์šฐ๋ฆฌ ํŒ€์€ ์•ˆ์ •์„ฑ, ์„ฑ๋Šฅ ๋ฐ ์œ ์—ฐ์„ฑ์˜ ์„ธ ๊ฐ€์ง€๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ฑ์ด ์›ํ™œํ•˜๊ฒŒ ์‹คํ–‰๋˜๊ธฐ๋ฅผ ์›ํ•˜๊ณ  "์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ”Œ๋žซํผ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š๊ณ  UI/UX ๋””์ž์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์–‘์€ ๊ทธ ๋ชฉํ‘œ์— ๋ฐ˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž‘์—…์— ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํˆฌ์ž…ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ์•ˆ์ •์„ฑ, ์„ฑ๋Šฅ ๋ฐ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด xamarin ํ˜•์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ๋™์ž‘/๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ๊ฐ ํ”Œ๋žซํผ๋ณ„ ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์œผ๋กœ ์•ฑ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@DanielCauser ์žฅ๊ธฐ์ ์œผ๋กœ ์ด๊ฒƒ์ด "๊ธฐ๋ณธ" ๋ฐฉ์‹์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ํ˜„์žฌ ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ํ˜„์žฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์†์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ํ›จ์”ฌ ๋” ๋งŽ์€ ์…ธ์„ ์ œ๊ณตํ•˜๋Š” ๋” ํ†ตํ•ฉ๋˜๊ณ  ํ˜„๋Œ€์ ์ธ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์‰˜์„ ๋‹จ์ผ ์ปจํŠธ๋กค๋กœ ์ œ๊ณตํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‰˜์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋ ค์ง€๊ณ  ๋ฐฐ์น˜๋˜๋Š”์ง€์— ๋Œ€ํ•ด ๋งŽ์ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์…ธ์— ๋Œ€ํ•œ 3๊ฐœ์˜ ๋“œ๋กœ์ž‰ ํŒจ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

@jassmith

  1. 500๊ฐœ ์ด์ƒ์˜ ์—ด๋ฆฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Xamarin Forms๋Š” 3๋…„์ด ์ง€๋‚ฌ๊ณ  ๊ธฐ๋ณธ ์ปจํŠธ๋กค ๋ฐ ๊ธฐ๋Šฅ์— ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•˜๊ณ  ์„ฑ๋Šฅ์ด ์•„์ง ์™„์ „ํžˆ ํ™•์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ผ๋ถ€ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์กŒ์Œ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Android์˜ ์„ฑ๋Šฅ์€ ๋ˆˆ์— ๋„๊ฒŒ ๋‚ฎ์Šต๋‹ˆ๋‹ค).
  3. Xamarin Forms ๊ฐœ๋ฐœ ํŒ€์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ทœ๋ชจ๊ฐ€ ์ž‘์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋จผ์ € ์œ„์˜ ๋‚ด์šฉ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ListView์™€ ๊ด€๋ จ๋œ ์œ„์˜ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋Œ€ํ•ด: ์™„์ „ํžˆ ์žฌ์„ค๊ณ„\๊ต์ฒดํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋Œ€๋‹ดํ•œ ์ฑ„ํƒ์— ๋ฐ•์ˆ˜๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. Xamarin Forms์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฑด๋“œ๋ ค์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

@opcodewriter

1) ๋„ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋™์˜ํ•˜๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์ถ”์ง„ํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„ ์ž‘์—… ํ•ญ๋ชฉ์„ ๊ณ„์†ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2) Android์—์„œ์˜ ์„ฑ๋Šฅ์€ ์ด์— ๋Œ€ํ•œ ์›๋™๋ ฅ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํŽ˜์ด์ง€ ์ „ํ™˜์„ ์œ„ํ•œ ๋” ๋งŽ์€ ํ—ค๋“œ์—… ์‹œ๊ฐ„์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ JIT ์‹œ๊ฐ„๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ์ง€๋Šฅ์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์ „์— ๋กœ๋“œํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. XF ํŒ€์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์ „์ฒด JIT ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. AOT๊ฐ€ ํ™œ์„ฑํ™”๋œ Android์—์„œ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ํ›จ์”ฌ ๋” ๋น ๋ฅธ ๊ฒฝ์šฐ ์ œ๊ฐ€ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

3) ์—ฌ๊ธฐ์—๋Š” ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋จผ์ € ์œ„์˜ ๋‚ด์šฉ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด ์ž‘์—…์€ ์˜ˆ์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์–‘์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์˜ ๊ฒฝ์˜์ง„์€ ๋‚˜์˜ ์กฐ์–ธ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋  ๋•Œ ์ผ์ •์„ ์žก์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ListView์™€ ๊ด€๋ จ๋œ ์œ„์˜ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋Œ€ํ•ด: ์™„์ „ํžˆ ์žฌ์„ค๊ณ„\๊ต์ฒดํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋Œ€๋‹ดํ•œ ์ฑ„ํƒ์— ๋ฐ•์ˆ˜๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. Xamarin Forms์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฑด๋“œ๋ ค์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

ListView๋Š” ์ง„์ •์œผ๋กœ Xamarin.Forms์˜ ๋ฒ„๊ทธ ๊ณฐ์ž…๋‹ˆ๋‹ค. 500๊ฐœ์˜ ๋ฌธ์ œ ์ค‘ 220๊ฐœ๊ฐ€ ๋ฒ„๊ทธ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ(๋งŽ์€ ํ•˜์šฐ์Šคํ‚คํ•‘ ๋˜๋Š” ๊ฐœ์„  ๋ฌธ์ œ๋„ ์žˆ์Œ) 25% ์ด์ƒ์˜ ๋ถ์ชฝ์€ ListView์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ต๋ฅผ ์œ„ํ•ด ์ „์ฒด UWP ํ”Œ๋žซํผ๊ณผ ๊ด€๋ จ๋œ ๋น„์œจ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ๊ธฐ ํ›„ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์„ค๋ช…๋˜๋Š” Android์˜ ๋” ๋‚˜์œ ์ˆ˜๋Š” ListView ๋ฒ„๊ทธ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ ListView๊ฐ€ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์— ์•„๋ฌด๋ฐ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ๊ฒ€์ƒ‰์— ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jassmith๋Š” ๊ธฐ์กด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ
- ์ง„์ •ํ•œ ํŒ์—… ์ง€์›(๊ธฐ๋ณธ ๋ฐ ๊ณตํ†ต ๊ธฐ๋Šฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์—†์Œ)
- ๋’ค๋กœ ํƒ์ƒ‰ํ•  ๋•Œ ํŽ˜์ด์ง€ ํƒ์ƒ‰ ์ทจ์†Œ(์˜ค๋žœ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ)
- ๊ธฐ๋ณธ ์ปจํŠธ๋กค ๋ˆ„๋ฝ(CheckBox, RadioButton ๋“ฑ ์—†์Œ)
- ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋“œ๋กœ์ž‰(์บ”๋ฒ„์Šค ์ปจํŠธ๋กค ๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•)
- ์†”๋ฆฌ๋“œ\๊ทธ๋ผ๋””์–ธํŠธ ๋ธŒ๋Ÿฌ์‹œ์˜ ํ”Œ๋žซํผ ๊ฐ„ ๊ทธ๋ฆฌ๊ธฐ ์ง€์›(SolidColorBrush, GradientBrush)

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋” ํ’๋ถ€ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋” ๋งŽ์€ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๊ณ  CSS ์Šคํƒ€์ผ์ด๋‚˜ Flexbox(์ž์ฒด ๋ฌธ์ œ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋จ)์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@opcodewriter

์ง„์ •ํ•œ ํŒ์—… ์ง€์›(๊ธฐ๋ณธ ๋ฐ ๊ณตํ†ต ๊ธฐ๋Šฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์—†์Œ)

๊ณตํ‰ํ•˜๊ฒŒ, ํ˜„์‹ค์ด ๋  ๋งŒํผ ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์–ป์ง€๋Š” ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์–ด๋Š ์‹œ์ ์—์„œ ๊ฝค ๋งŽ์ด ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋’ค๋กœ ํƒ์ƒ‰ํ•  ๋•Œ ํŽ˜์ด์ง€ ํƒ์ƒ‰ ์ทจ์†Œ(์˜ค๋ž˜ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ)

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ MaterialShell์ด โ€‹โ€‹ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด NavigationPage์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋Š” ๊ฝค ํ™•์‹คํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ปจํŠธ๋กค ๋ˆ„๋ฝ(CheckBox, RadioButton ๋“ฑ ์—†์Œ)

์ด๋“ค ์ค‘ ์ผ๋ถ€๋Š” ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ F100 ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋“œ๋กœ์ž‰(์บ”๋ฒ„์Šค ์ปจํŠธ๋กค ๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•)

์ด๊ฒƒ์€ #2452์— ๋ช…์‹œ๋œ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ž๋งค API๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹จ์ƒ‰/๊ทธ๋ผ๋””์–ธํŠธ ๋ธŒ๋Ÿฌ์‹œ์˜ ํ”Œ๋žซํผ ๊ฐ„ ๊ทธ๋ฆฌ๊ธฐ ์ง€์›(SolidColorBrush, GradientBrush)

์œ„์™€ ๊ฐ™์€ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค.

@jassmith

๊ณตํ‰ํ•˜๊ฒŒ, ํ˜„์‹ค์ด ๋  ๋งŒํผ ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์–ป์ง€๋Š” ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์–ด๋Š ์‹œ์ ์—์„œ ๊ฝค ๋งŽ์ด ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. 2018๋…„ ๋ง๊นŒ์ง€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. :)

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ MaterialShell์ด โ€‹โ€‹ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด NavigationPage์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋Š” ๊ฝค ํ™•์‹คํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ˜„์žฌ ๊ตฌํ˜„์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๋“ค ์ค‘ ์ผ๋ถ€๋Š” ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ F100 ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์•Œ ๊ฒ ์–ด์š”. ์†๊ฐ€๋ฝ์ด..

์ด๊ฒƒ์ด ํ˜„์žฌ ๊ตฌํ˜„์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ํŠธ๋ž™์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃจ์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ ์š”์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • iOS์—์„œ๋Š” ๋’ค๋กœ ์Šค์™€์ดํ”„ ์ œ์Šค์ฒ˜๋ฅผ ๋ฐ˜์‘์ ์œผ๋กœ ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์ด ๋” ํฐ ์ „ํ™”๋กœ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋ˆˆ์— ๋„๋Š” ๋ˆ„๋ฝ์ด ๋ฉ๋‹ˆ๋‹ค.
  • iOS์—์„œ ์ด ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ iOS์˜ ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜ฌ ๋•Œ ์‹ค์ œ๋กœ ์ง€์›๋˜๊ฑฐ๋‚˜ ์ž‘๋™ํ• ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ UINavigationController์˜ ๋‚ด๋ถ€์— ์ƒ๋‹นํžˆ ๊นŠ์ด ๋“ค์–ด๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ Apple์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ์ผ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šคํƒ€์ผ๋ง์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์†Œํ•œ ์šฐ๋ ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธด ์ด์•ผ๊ธฐ๋Š” ์งง์Šต๋‹ˆ๋‹ค. ์ด ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋…ผ์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒˆ ํ˜ธ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :)

@jassmith
๋‚œ ๊ทธ๋ƒฅ ์ฒ˜๋ฆฌ ์ƒ๊ฐํ–ˆ๋‹ค gestureRecognizerShouldBegin ๊ฐ™์€ ๋ฐ ์ „ํ™” ๋ญ”๊ฐ€ OnBackButtonPressed ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ๋‚ด๊ฐ€ ์ฝ๊ณ  ์žˆ๋Š” ๋งŽ์€ ๊ฒƒ์„ ์ •๋ง๋กœ ์ข‹์•„ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ํ•ต์‹ฌ Xamarin Forms nuget/repo์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Xamarin Forms์— ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ ์œ„์— ๊ตฌ์ถ•๋˜์–ด์•ผ ํ•˜๋Š” ๋…๋‹จ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ด๊ฒƒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ด…๋‹ˆ๋‹ค. ๋…ธ์ถœํ•ด์•ผ ํ•˜๋Š” Xamarin Forms์˜ ํ•„์ˆ˜ ๋ถ€๋ถ„์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” ํ•ด๋‹น ๋น„ํŠธ ์œ„์— ๋นŒ๋“œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ Xamarin Classic/Native ๋˜๋Š” Xamarin Forms๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Xamarin Forms ๋˜๋Š” Xamarin Forms with Shell์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๊ฒฐ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Xamarin Forms๋Š” ํ”Œ๋žซํผ์„ ์„œ๋กœ ๋‹ฎ๋„๋ก ๋งž์ถ”๋ ค๊ณ  ํ•˜์ง€ ์•Š๊ณ  ์ตœ๊ณ ์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์ค‘์ ์„ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  Xamarin Forms๋Š” ํ”Œ๋žซํผ ๋Š๋‚Œ์ด ์กด์ค‘๋˜๋„๋ก ํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์…ธ์ด Xamarin Forms ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ๊ณ  ์…ธ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ผ๋ถ€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ Material Shell์ด โ€‹โ€‹ํŠน์ • ๋””์ž์ธ ์–ธ์–ด ๋ฐ ํƒ์ƒ‰ ํŒจํ„ด์— ๋„ˆ๋ฌด ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด Xamarin Forms ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ์—๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@MisterJimson
์˜๊ฒฌ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐœ API ๋…ธ์ถœ ์˜์—ญ์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋Š” ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์–‘์€ Shell๊ณผ MaterialShell ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. MaterialShell ํด๋ž˜์Šค๋Š” ํ•ต์‹ฌ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Shell์€ ๊ท€ํ•˜๊ฐ€ ์„ค๋ช…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Shell breakout ๋ฐ ํƒ์ƒ‰ ์‚ฌ์–‘ ์—…๋ฐ์ดํŠธ๋กœ ์—…๋ฐ์ดํŠธ๋จ

๊ธฐ์กด XF ๊ตฌํ˜„์ด ๋งŒ๋“ค์–ด์ง€๋ฉด ์ •๋ง ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. BCL์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ์• ๋“œ์˜จ์œผ๋กœ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •ํ™•ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋ฐ˜ ํ”Œ๋žซํผ์„ ๋ณด์œ ํ•˜๋ฉด ๊ธฐ์กด ์•ฑ๊ณผ ์ด์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ณ„์ธต์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌผ๊ฑด์˜ ๋ฐœ์ „์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@jassmith @brianlagunas

๋‹จ์ง€ ๋ช‡ ๊ฐ€์ง€ ๊ด€์ฐฐ.

  • BackButtonBehavior, ์ „ํ˜€ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ ์†์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • Materialshell ํƒ์ƒ‰ ์ฒด๊ณ„๋Š” Prism๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? (ํ”„๋ฆฌ์ฆ˜, FreshMVVM, MVVMCross)
  • ํƒ์ƒ‰ ๋ชจ์Œ์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ์™„์ „ํžˆ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Œ€๋กœ Forms๋Š” ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋งค์šฐ ์ œํ•œ์ ์ด๋ฉฐ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ Forms๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋„๋ก ํ•˜๋Š” ํˆฌ๋ฐ•ํ•œ ํƒ์ƒ‰ ๋ชจ์Œ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.
  • MasterDetail์€ ๋งŽ์ด ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”Œ๋ผ์ด์•„์›ƒ ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์šฐ๋ฆฌ๋Š” ํ–„๋ฒ„๊ฑฐ์— ๋Œ€ํ•ด ์–ด๋–ค ํ†ต์ œ๊ถŒ์„ ๊ฐ–๊ฒŒ ๋ ๊นŒ์š”?

๋‚˜๋Š” ๋‹จ์ง€ ๊ธฐ์กด์˜ ๋ฌธ์ œ์ ๊ณผ ํ•œ๊ณ„๊ฐ€ ํ•ด๊ฒฐ๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ž˜ ๋“ค๋ฆฐ๋‹ค.

์ €๋Š” XF๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹ค์†Œ ์ทจ์•ฝํ•˜๋‹ค๋Š” ํ‰ํŒ์„ ์–ป์—ˆ์ง€๋งŒ ํ™•์‹คํžˆ ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋…ธ๋ ฅ ๋•๋ถ„์— ๋น ๋ฅด๊ฒŒ ๊ฐœ์„ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์ด ๊ฐ€์น˜์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด๊ฒƒ์€ ๋‚ด ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค :-)

๋˜ํ•œ, ๊ธˆํ˜• ๋ฐ ๊ธฐ์ˆ ์  ๋ถ€์ฑ„ ์ƒํ™˜๊ณผ ํ•จ๊ป˜ ํ•  ์ˆ˜์žˆ๋Š” ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ๋ชจ๋‘ ์ž ๋งˆ๋ฆฐ ์ˆœ๊ฐ„์— ๋งŽ์€ ์‚ฌ๋ž‘์„ ๋ฐ›๊ณ ํ•˜์ง€๋งŒ @opcodewriter์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ๊ณ„์ธต์ด์–ด์•ผ ํ•œ๋‹ค๋Š” @MisterJimson ์˜ ์ƒ๊ฐ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ๋Šฅ๋ ฅ๊ณผ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์Šค์Šค๋กœ์—๊ฒŒ ์ •์งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์ƒˆ๋กญ๊ณ  ๋ฐ˜์ง์ด๋Š” ๊ฒƒ๋“ค์„ ์ฝ”๋”ฉํ•˜๊ณ  ์–ด๋ ค์šด ๊ฒฐ์ •์„ ํ”ผํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ ๊ฒฌ๊ณ ํ•œ ๊ธฐ๋ฐ˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์‹ ์—๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๋‚ด ์ฝ”๋“œ๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :-)

XF๋Š” ํ˜„์žฌ ์ข‹์€ ์œ„์น˜์— ์žˆ์œผ๋ฉฐ ์ •๋ง ๊ฒฌ๊ณ ํ•œ ๋„๊ตฌ ์„ธํŠธ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@๋งฅ์ผ€์ธ

BackButtonBehavior, ์ „ํ˜€ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ ์†์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

CanExecute๊ฐ€ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ช…๋ น์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ ๋ณด์กฐ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Materialshell ํƒ์ƒ‰ ์ฒด๊ณ„๋Š” Prism๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? (ํ”„๋ฆฌ์ฆ˜, FreshMVVM, MVVMCross)

๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๋ ‡๊ฒŒ ๋ฐ”๋ž๋‹ˆ๋‹ค! ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๋“ค๊ณผ ๊ทธ๋“ค์˜ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ํƒ์ƒ‰์ด ๋‹จ์ผ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํƒ์ƒ‰ ๋ชจ์Œ์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ์™„์ „ํžˆ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Œ€๋กœ Forms๋Š” ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋งค์šฐ ์ œํ•œ์ ์ด๋ฉฐ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ Forms๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋„๋ก ํ•˜๋Š” ํˆฌ๋ฐ•ํ•œ ํƒ์ƒ‰ ๋ชจ์Œ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์ด ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ํ™•์žฅ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์„ ์ œ์ •์‹ ์ด๊ณ  ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์€ ์ •๋ง ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

MasterDetail์€ ๋งŽ์ด ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”Œ๋ผ์ด์•„์›ƒ ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ—ค๋”๋ฅผ ์ž„์˜์˜ ๋ณด๊ธฐ๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ฃน ํ—ค๋” ๋ฐ ํ•ญ๋ชฉ์— ์‚ฌ์šฉ๋˜๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ œ์–ดํ•˜๊ณ , ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์•„์›ƒ์˜ ์ผ๋ถ€ ์ธก๋ฉด์„ ์ œ์–ดํ•˜์ง€๋งŒ 100%๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋‹น์‹ ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋‹ฅ๊ธ€ ๋™์ž‘ ์†์„ฑ์ด ์žˆ๋Š” ๋ฐ”๋‹ฅ๊ธ€์˜ ํ•„์š”์„ฑ์„ ๋ถ„๋ช…ํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ–„๋ฒ„๊ฑฐ์— ๋Œ€ํ•ด ์–ด๋–ค ํ†ต์ œ๊ถŒ์„ ๊ฐ–๊ฒŒ ๋ ๊นŒ์š”?

BackButtonBehavior๋Š” ํ–„๋ฒ„๊ฑฐ๋„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์ œ์•ˆ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์›๋ž˜ LeftBarButton์ด๋ผ๊ณ  ๋ถˆ๋ €์ง€๋งŒ RTL ์ƒํ™ฉ์—์„œ๋Š” ์™ผ์ชฝ์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

@stevehurcombe ๊ธฐ์ˆ ์  ํˆฌ์ž ํšŒ์ˆ˜๋Š” ๊ณ„์† ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŒ€์˜ ํ›จ์”ฌ ๋” ์ž‘์€ ํŒŒ๊ฒฌ๋Œ€์— ์˜ํ•ด ๋™์‹œ์— ์‹คํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํ˜„์‹ค์€ ์ด ์‚ฌ์–‘์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ด์ƒํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์ˆ ์ ์ธ ํšŒ์ˆ˜์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Xamarin.Forms๋Š” 1.0 ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ ์—„์ฒญ๋‚œ ์–‘์˜ API ๋ถ€์ฑ„๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๊ณ  ๊ทธ ์ดํ›„๋กœ ๊ณ„์† ๊ทธ ๋ถ€์ฑ„๋ฅผ ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. XF์˜ ์–ด๋–ค ๊ฒƒ๋“ค์€ ๋‹จ์ˆœํžˆ API๊ฐ€ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

ํˆด๋ง๊ณผ ๊ด€๋ จํ•˜์—ฌ ์™„์ „ํžˆ ๋ณ„๋„์˜ ํŒ€์ด ์ด ์ž‘์—…์„ ์ „๋‹ดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํฐ ๋ฐœ์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋„๊ตฌ๋Š” ์ง€๋‚œ 6๊ฐœ์›” ๋™์•ˆ ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ๋ถ„์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ๋ฅผ ์ •๋ง๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!

@๋งฅ์ผ€์ธ

Materialshell ํƒ์ƒ‰ ์ฒด๊ณ„๋Š” Prism๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? (ํ”„๋ฆฌ์ฆ˜, FreshMVVM, MVVMCross)

๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ์„ธ์š” . ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ธฐ ์ „์—

@dansiegel

๋‘ ํŒ€ ๋ชจ๋‘ ๋Œ€ํ™” ์ค‘์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋งŒ ์•Œ๋ฉด ๋ฉ๋‹ˆ๋‹ค ๐Ÿ‘

@jassmith ์ด์ œ XF์—์„œ ์ผ๋ถ€๊ฐ€ ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ตœ์ƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ง€์—๊ฒŒ ๋ฆฝ์Šคํ‹ฑ์„ ๋ฐ”๋ฅด๋Š” ๋Œ€์‹ (์—ฌ๊ธฐ์„œ ๋ฌด๋ก€ํ•œ ๊ฒƒ์€ ์›ํ•˜์ง€ ์•Š์Œ), ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋Œ€๊ทœ๋ชจ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋งค์šฐ ๋ฌด์„ญ๊ฒŒ ๋“ค๋ฆฌ๊ฒ ์ง€๋งŒ ๋Œ€๋‹ค์ˆ˜์˜ Xamarin Forms ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์•ฑ์„ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ํ›จ์”ฌ ๋” ์ž˜ ์‹คํ–‰๋˜๋Š” ์•ฑ์„ ๊ฐ–๊ฒŒ ๋˜์–ด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
"์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ณ€๊ฒฝ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—" ์ข‹์€ ๋ฆฌํŒฉํ† ๋ง์œผ๋กœ PR์ด ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๊ทธ ๊ทœ์น™์„ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๋Š” ์‹ฌํ˜ธํก์„ ํ•˜๊ณ  ๊ธด์žฅ์„ ํ’€๊ณ  "๊ทœ์น™"์„ ์žฌ๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ฌด์—‡์ด ์ตœ์„ ์ž…๋‹ˆ๊นŒ? ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์—†๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ณ„์† ์ขŒ์ ˆ์‹œํ‚ค๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ขŒ์ ˆํ•œ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฐ€์ง‘๋‹ˆ๊นŒ? ๋‚ด 2์„ผํŠธ๋งŒ...

@opcodewriter ๋‹น์‹ ๊ณผ ๋‚˜๋Š” ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ด ์‚ฌ์–‘์—์„œ

ํƒ์ƒ‰์— ๊ด€ํ•œ ์ƒˆ๋กœ์šด ์ž๋ฃŒ๋ฅผ ์ฝ๊ณ  ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ํƒ์ƒ‰ ๋ช…๋ น์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  URL(์˜ˆ: Prism์˜ ์˜ํ–ฅ์„ ๋ฐ›์€ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •)์— ๋Œ€ํ•œ ํƒ์ƒ‰ ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ URI ํƒ์ƒ‰ ์ฒด๊ณ„๋Š” ์˜ˆ์ „์— ์šฐ๋ฆฌ๊ฐ€ ํ•˜๊ณ  ์‹ถ์—ˆ๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Prism์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์‹ ์šฉ์„ ๋ฐ›์ง€ ์•Š์œผ๋ ค๋ฉด 100% ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. :)

์†๊ธฐ์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ๋Š” ์•„์ง ํŒŒ์•…๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

<Button Command="{segue:Uri}" CommandParameter="app://Foo/Bar/Baz" />

๋˜๋Š”

<Button Command="{segue:Push}" CommandParameter="{DataTemplate local:MyPage}" />

๋”ฐ๋ผ์„œ ํ™•์žฅ์€ ๊ทธ๋“ค์ด ์ทจํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋” ์ •ํ™•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ฃผ๋กœ Intellisense๋กœ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@jassmith ์ด segue ๋ฌผ๊ฑด์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ‘ธ์‹œ ๋ชจ๋‹ฌ์„ ์–ด๋–ป๊ฒŒ ์ง€์›ํ•  ์ƒ๊ฐ์ธ์ง€ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”?

๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ํ”„๋ฆฌ์ฆ˜์ฒ˜๋Ÿผ ๋งˆํฌ์—… ํ™•์žฅ์œผ๋กœ ์‹ธ์ธ URL ํƒ์ƒ‰์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<!-- push -->
<Button Command="{segue:Uri}" CommandParameter="path/to/page" />

<!-- push modal -->
<Button Command="{segue:Uri Modal='true'}" CommandParameter="path/to/page" />

<!-- reset stack -->
<Button Command="{segue:Uri}" CommandParameter="app://root/path/to/page" />

๋จผ์ € URI ํƒ์ƒ‰์€ Shell์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•œ ๊ฒฝ์šฐ ์—†์ด ์Šคํƒ์„ ์ผ๊ด€๋˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์žฅ์†Œ์ด๋ฉฐ ๊ฐœ๋…์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํƒ์ƒ‰ ์ƒํ˜ธ ์ž‘์šฉ์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ „์ฒด URI๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„์€ ์ƒํ™ฉ์— ๋งž๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฃจ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์œ„์น˜๊ฐ€ app://Shell/Apps/Games/Details ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด 3๊ฐ€์ง€ ์˜ˆ๊ฐ€

ํŠนํžˆ ์ด๊ฒƒ์€ ํ˜„์žฌ ShellItem์— Apps ๊ฒฝ๋กœ๊ฐ€ ์žˆ๊ณ  ํ˜„์žฌ ShellTabItem์— Games ๊ฒฝ๋กœ๊ฐ€ ์žˆ์œผ๋ฉฐ ContentPage๊ฐ€ ๊ฒฝ๋กœ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ์Šคํƒ์— ํ‘ธ์‹œ๋œ Shell์— ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

<!-- push -->
<Button Command="{segue:Uri}" CommandParameter="app://Shell/Apps/Games/Details/page" />

<!-- push modal -->
<Button Command="{segue:Uri}" CommandParameter="app://page" />

<!-- reset stack -->
<Button Command="{segue:Uri}" CommandParameter="app://Shell/Apps/Games" />

์‰˜ uri์—์„œ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜๋Š” ํ•ญ์ƒ ์‰˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ชจ๋‹ฌ ํ‘ธ์‹œ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ShellTab์ด๊ณ  ShellTabItem์ž…๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์€ ShellTabItem์˜ ํƒ์ƒ‰ ์Šคํƒ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํŽ˜์ด์ง€ ์ปจํŠธ๋กค์— URI ํƒ์ƒ‰์„ ๋ฐฑํฌํŒ…ํ•  ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ MasterDetailPage๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ •๋ง ํ„ธ์ด ๋‚ฉ๋‹ˆ๋‹ค...

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

@jassmith ๋Š” ์ด ํƒ์ƒ‰

  1. CanExecute ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. ๋‹ค์ค‘ ํƒญ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ์–ด(์ฝ๊ธฐ ๋ฐฉ์ง€)ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  3. ์ƒ๋Œ€ ํƒ์ƒ‰์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? IE๋Š” 3ํŽ˜์ด์ง€์ด๊ณ  ์•ž์œผ๋กœ ๊ฐ€์•ผ ํ•˜์ง€๋งŒ ์Šคํƒ์ด ์™„์ „ํžˆ ๋™์ ์ž…๋‹ˆ๊นŒ?
  4. prism์€ NavigationParameters ๋ผ๋Š” ํ™˜์ƒ์ ์ธ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด /Navigation/MyPage/MyPageDetails?id=33 ํ†ตํ•ด ๊ธฐ๋ณธ ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ณต์žกํ•œ ๊ฐ์ฒด new NavigationParameters {{nameof(MyObject), MyObject}} ๋„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ๊ฒƒ์„ ์ง€์›ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ChaseFlorell

1) ์„ธ๊ทธ์™€ ํ•จ๊ป˜? ํ˜„์žฌ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋” ์ƒ๊ฐํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. segue ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€... ์งœ์ฆ๋‚œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ์‹œ์ ์—์„œ ์ •๋ง ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

2) Segue๋Š” ํ‘ธ์‹œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ž์ฒด์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ํƒ์ƒ‰ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ no-op ๋ช…๋ น์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๊ณ  ์ถ”๊ฐ€๋กœ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

3) ์„ธ๊ทธ์™€ ํ•จ๊ป˜ ํ‘ธ์‹œ/ํŒ๊ณผ ๊ฐ™์€ ๊ธฐ์กด ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๋Œ€์ ์ธ ์กฐ์น˜์ž…๋‹ˆ๋‹ค.

4) [QueryParameterAttribute]๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธ๋„ ๊ฑฐ๋ถ€๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ;)

๋ณต์žกํ•œ ๊ฐœ์ฒด ์ง€์›์„ ์ถ”๊ฐ€ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋ณต์žกํ•œ ๊ฐœ์ฒด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(P & P์— ๋‹ค์‹œ CAB-๋ณตํ•ฉ UI ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ธ”๋ก์—์„œ) URI ๊ธฐ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํƒ์ƒ‰์„ ๊ตฌ์ถ• ๊ณผ๊ฑฐ์˜ ๊ฒฝํ—˜์—์„œ, ๋‚˜๋Š” ๊ฐ•ํ•˜๊ฒŒ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ System.Uri ์œ ํ˜•์„ ๋Œ€์‹  ๋‹จ์ง€ URI์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒƒ์„ ๋ณด์ด๊ฒŒ, ๊ทธ๋Ÿฌ๋‚˜ URI ๊ตฌํ˜„ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. @pprovost ๋Š” ํ‰์ƒ ๊ทธ์—๊ฒŒ ๋‚จ๊ฒจ์ง„ ๋…ธ๋™์˜ ์ƒ์ฒ˜๋ฅผ ์ฆ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท URI ์ œํ•œ ๋ฐ ์˜ค๋ฅ˜(์˜ˆ: ํ˜ธ์ŠคํŠธ ์ด๋ฆ„)์— ์ง๋ฉดํ–ˆ์„ ๋•Œ ์ˆ˜๋งŽ์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ํ”ผํ•ด๋ฅผ ์ž…์€ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ System.Uri๋Š” URI ๊ธฐ๋ฐ˜ ํƒ์ƒ‰ ์ฒด๊ณ„๋ฅผ ์ง€์›ํ•  ๋•Œ ๊ฐ€์žฅ ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. CAB๋Š” URI ํƒ์ƒ‰์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ System.Uri ๊ฐœ์ฒด ๋Œ€์‹  ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ URI์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์€ ์ ˆ๋Œ€ ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์–ด๋–ค ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ๋„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๋Š์Šจํ•œ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ API์ž…๋‹ˆ๋‹ค. URI/๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ํƒ์ƒ‰ ์ฒด๊ณ„๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ๊ทœ์น™์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž„์˜์˜ URI๋Š” XF์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. URL์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์ง€๋งŒ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์œ ํšจํ•œ ๋ฌธ์ž ๋ชฉ๋ก์€ ์ •ํ™•ํžˆ ์ž‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋ฌธ์ž์—ด์ด ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฉฐ URI๋Š” ์ด์Šค์ผ€์ดํ”„ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”(๋˜๋Š” ์‹คํŒจํ•˜๋Š”) ์ด์œ ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  "URI ์•ˆ์ „"์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ ํ•„์š”ํ•˜์ง€๋„ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ์ œํ•œ์ ์ธ(๋˜๋Š” ๋” ๋‚˜์€ ์˜๋ฏธ๋ก /ํŒŒ์‹ฑ/๊ฒ€์ฆ?) ์ž์‹ ์˜ ์ถ”์ƒํ™”๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ IMHO, System.Uri ๋Š” ๋ฌด๋ฃŒ๊ฐ€ ์•„๋‹Œ ๋งŽ์€ ์ธํ„ฐ๋„ท ์ˆ˜ํ•˜๋ฌผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Mono/MonoDevelop์ด ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ FilePath ๋ฅผ ์ƒ์„ฑํ•œ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

์ ์–ด๋„ ๋ชจ๋“  URI๋Š” ์ƒ๋Œ€์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. CAB์—์„œ๋Š” ์Šคํ‚ค๋งˆ ๋ฐ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ๋ถ€๋ถ„๊ณผ ํ•จ๊ป˜ ์ ˆ๋Œ€ uri๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Uri ๋ณด๋‹ค ResoucePath ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ›จ์”ฌ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒŒ์ž„ ํ›„๋ฐ˜๋ถ€์—๋Š” ์–ด์จŒ๋“  ๊ฑฐ๋ž˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๊ฐ€ ๋ฌด์—‡๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค...

์‹œ์Šคํ…œ์„ ํ˜ผ๋™ํ•˜๊ธฐ ์œ„ํ•ด URI๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ? ์Šคํ‚ค๋งˆ์™€ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ๋ฌด์‹œํ•˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค([az]๋กœ๋งŒ ์ œํ•œ๋จ). ์–ด๋–ค ์ด์ƒํ•œ ๋ฌธ์ž๋ฅผ ๋„ฃ์–ด๋„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ๊ทธ๋ƒฅ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅํ•œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์€ ์œ ํšจํ•œ C# ์‹๋ณ„์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹จ์ˆœํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ์˜ ์ด์Šค์ผ€์ดํ”„๋œ ๋ฐ์ดํ„ฐ๋Š” ์ด์Šค์ผ€์ดํ”„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@kzu URI๋Š” XF์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ํŒŒ์ผ ์‹œ์Šคํ…œ ์Šคํ‚ค๋งˆ๋ณด๋‹ค XF์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์›น์‚ฌ์ดํŠธ์—์„œ ์•ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ URI๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Prism ๊ตฌํ˜„์„ ๋ณด๊ณ  URI ๊ธฐ๋ฐ˜ ํƒ์ƒ‰์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URI ๊ธฐ๋ฐ˜ ํƒ์ƒ‰ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Prism์œผ๋กœ ๊ตฌ์ถ•๋œ ๋ชจ๋“  ์•ฑ ์ค‘์—์„œ ์ž˜๋ชป๋œ ๋ฌธ์ž์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ์ œ์ถœ๋œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. XF ํ”Œ๋žซํผ์˜ URI ๊ธฐ๋ฐ˜ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์šฐ๋ ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋งž๋Š” ๋ง์ด๋‹ค. Prism @brianlagunas์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ •๋ณด์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด์ œ ์‚ฌ์–‘์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ๊ณ  ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ;)

๋งค์šฐ ์ข‹์€ ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ์ด์ง€๋งŒ ๊ณ ๊ฐ์„ ์œ„ํ•ด "ํŠน๋ณ„ํ•œ" ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ๊ฐ€์ƒ ๋ฐฉ๋ฒ• ๋˜๋Š” ๊ธฐํƒ€ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค์–ด ํ™•์žฅ์„ฑ๊ณผ ์‚ฌ์šฉ์ž ์ง€์ •์ด ๊ณ ๋ ค๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€๋Šฅํ• ๊นŒ์š” / ์–ด๋–ป๊ฒŒ:

  1. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„์ด์ฝ˜์ด ์žˆ๋Š” ๋ฐฐ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ํƒญ ํ™•์žฅ์„ฑ. ๋˜๋Š” "๋”๋ณด๊ธฐ" ๋˜๋Š” " * " ๋ฒ„ํŠผ๊ณผ ๊ฐ™์€ ํŒ์—… ์ฐฝ์„ ์œ„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž ์ง€์ • ์Šค๋‚ต๋ฐ”(์˜ˆ: ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐฐ๊ฒฝ/์ „๊ฒฝ ์ƒ‰์ƒ์œผ๋กœ ๋ฐฉ๊ธˆ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ "์‹คํ–‰ ์ทจ์†Œ" ๋ฒ„ํŠผ ํฌํ•จ)
  3. ๊ฐ€์žฅ ๋น ๋ฅธ ํƒ์ƒ‰์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์…ธ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋œ ๊ธฐ๋ณธ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๋‹ค๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Android์—์„œ ํ”„๋ž˜๊ทธ๋จผํŠธ ํ‘ธ์‹œ.

๊ธฐ์ˆ  ์ •๋ณด: ์‰˜์ด ํŽ˜์ด์ง€๋ฅผ ์žฌํ™œ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ๋‘ ๋ฒˆ ํƒ์ƒ‰ํ•˜๋ฉด ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ๊ทธ ์•„๋ž˜์— ์žˆ๋Š” ๋‹ค๋ฅธ VM๊ณผ ํ•จ๊ป˜ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @rogihee

๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/xamarin/Xamarin.Forms/blob/9558f2837280e02b41848d3a3c3213d49a664751/Xamarin.Forms.Platform.iOS/Renderers/ShellRenderer.cs

Android๋Š” ํ˜„์žฌ ์—ฌ์ „ํžˆ ํ™œ๋ฐœํžˆ ๊ฐœ๋ฐœ ์ค‘์ด์ง€๋งŒ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@rogihee ํŽ˜์ด์ง€ ์žฌํ™œ์šฉ์— ๊ฑด์ „ํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์˜ตํŠธ์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ˜„์žฌ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด "Create*" ์˜ต์…˜์ด ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์ง„ํ–‰์„ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค!

์š”์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋” ๋†’์€ Mem/CPU ์‚ฌ์šฉ๋Ÿ‰๋ณด๋‹ค ์•ฑ์˜ ์†๋„์™€ "์œ ์—ฐํ•œ" ๋Š๋‚Œ์„ ์šฐ์„ ์‹œํ•ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก  ๊ฒฐ๊ตญ ์–ด๋”˜๊ฐ€์— ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ์ง€๋งŒ). ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค iOS / Android๋ฅผ ์šฐ์„ ์‹œํ•˜์‹ญ์‹œ์˜ค :-).

Shell์€ ์œ ๋™์„ฑ์— ๋Œ€ํ•œ ์ธ์‹์— ๋งค์šฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์•„์ง ์–ด๋””์—๋‚˜ ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ํ•จ๊ป˜ ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‰˜์ด ์„ค๊ณ„๋œ ๋ถ€ํ•˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‰˜๋กœ ๋ฏธ์นœ ์ง“์„ ํ•˜๋ ค๋Š” ์ดˆ๊ธฐ ์‚ฌ์šฉ์ž๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jassmith mig๋Š” Build์—์„œ 3๋ถ„ ๋™์•ˆ ์‰˜์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.....

๋‚˜๋Š” ๊ทธ์˜ ์•„๋น ๊ฐ€ ์•„๋‹ˆ๋‹ค

+1

์„ธ๊ณ„์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ์ผ์น˜ํ•˜๋„๋ก API๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ƒ˜ํ”Œ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ์—…๋ฐ์ดํŠธ๋œ ์ƒ˜ํ”Œ์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์†๊ธฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค๋ฅธ ์ƒ˜ํ”Œ์„ ์ˆ˜์ •ํ•˜๊ณ  ๊ฒฝ๋กœ ์„ค๋ช…์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ฐ„๋‹จํ•œ ๊ฒฝ๋กœ๋ฅผ ์–ป์Œ์— ๋”ฐ๋ผ!)

์ด๋Ÿฐ, ํŒŒํ‹ฐ์— ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ์˜จ ๊ฒƒ ๊ฐ™์•„. ํ›Œ๋ฅญํ•œ ๊ธ€๊ณผ ํ† ๋ก . ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ชจ๋‘ ํ›‘์–ด๋ณด๊ณ  (๊ณตํ•ญ์—์„œ ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค) ๋‚ด ์ž์‹ ์˜ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@jassmith @migueldeicaza ํƒ์ƒ‰ ๋ชจ์Œ์— ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜์—ฌ ListView๊ฐ€ ์Šคํฌ๋กค๋  ๋•Œ ์Šคํฌ๋กค๋˜๊ณ  ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์Šคํฌ๋กค๋  ๋•Œ ํ‘œ์‹œ๋˜๋„๋ก ๋™์ž‘์„ ์ถ”๊ฐ€ํ•ด ์ฃผ ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ ? ๊ฑฐ์˜ ๋ชจ๋“  ์ „๋ฌธ ์•ฑ์ด ๋” ๋งŽ์€ ๋ถ€๋™์‚ฐ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์†Œํ˜• ์žฅ์น˜์—์„œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก XAML ํƒœ๊ทธ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ShellSection ๋Œ€์‹  Tab์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด์ œ ShellX ํƒœ๊ทธ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

iOS์˜ ๊ฒฝ์šฐ ํƒ์ƒ‰ ๋ชจ์Œ์—์„œ ์Šคํฌ๋กค ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ผœ๊ณ  ๋„๋Š” ์†์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Android์˜ ๊ฒฝ์šฐ ์ƒˆ ๋ ˆ์ด์•„์›ƒ(CoordinatorLayout, AppBarLayout ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. XF์˜ Android ๊ตฌํ˜„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๋กœ RelativeLayout์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์ƒ๋‹นํžˆ ๊ตฌ์‹์ž…๋‹ˆ๋‹ค. ์ด ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐœ์„  ํ‹ฐ์ผ“์ด ์–ด๋”˜๊ฐ€์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Shell์ด โ€‹โ€‹๋‹ค์–‘ํ•œ ์Šคํฌ๋กค ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํŽ˜์ด์ง€์— ์˜ค๋ฅ˜/๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒ์—…์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ๋™์ž‘์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. Shell์€ ์ด ๊ธฐ๋Šฅ์„ ์ฆ‰์‹œ ์ง€์›ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ UI ๊ณ„์ธต์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@adrianknight89

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

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ •๋ง๋กœ ํ•  ์ˆ˜์žˆ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ชจ๋“  ํ”Œ๋žซํผ์ด ์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ฒฐ๊ตญ ํ”Œ๋žซํผ๋ณ„ ๊ฑฐ๋ž˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Android๋Š” ์ตœ์†Œํ•œ ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋” ์ผญ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก XAML ํƒœ๊ทธ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ShellSection ๋Œ€์‹  Tab์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด์ œ ShellX ํƒœ๊ทธ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋„ค์ด๋ฐ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ShellTab์€ ์ƒ๋‹จ๊ณผ ํ•˜๋‹จ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋” ์ผ๋ฐ˜์ ์ธ ๊ณ„์ธต์  ์ด๋ฆ„์„ ์„ ํƒํ–ˆ์ง€๋งŒ ์ด๋ฆ„ ์ง€์ •์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ์€ 100% ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋“ค์˜ ์ด๋ฆ„์„ ๋‹ค์‹œ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ๋ฅผ ์™„์ „ํžˆ ๊ธฐ๋Œ€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ...

iOS์˜ ๊ฒฝ์šฐ ํƒ์ƒ‰ ๋ชจ์Œ์—์„œ ์Šคํฌ๋กค ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ผœ๊ณ  ๋„๋Š” ์†์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Android์˜ ๊ฒฝ์šฐ ์ƒˆ ๋ ˆ์ด์•„์›ƒ(CoordinatorLayout, AppBarLayout ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. XF์˜ Android ๊ตฌํ˜„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๋กœ RelativeLayout์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์ƒ๋‹นํžˆ ๊ตฌ์‹์ž…๋‹ˆ๋‹ค. ์ด ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐœ์„  ํ‹ฐ์ผ“์ด ์–ด๋”˜๊ฐ€์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Shell์ด โ€‹โ€‹๋‹ค์–‘ํ•œ ์Šคํฌ๋กค ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Shell์€ CoordinatorLayout + AppBarLayout์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹น๋ถ„๊ฐ„ ์Šคํฌ๋กค ์ง€์›์„ "๋น„ํ™œ์„ฑํ™”"ํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. iOS ์Šคํฌ๋กค ์˜คํ”„๋„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ UWP์˜ NavigationView๋Š” ์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํŽ˜์ด์ง€์— ์˜ค๋ฅ˜/๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒ์—…์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ๋™์ž‘์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. Shell์€ ์ด ๊ธฐ๋Šฅ์„ ์ฆ‰์‹œ ์ง€์›ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ UI ๊ณ„์ธต์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์˜ˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :)

@jassmith

James Montemagno์˜ ์—ฐ๊ฒฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ธํ„ฐ๋„ท์ด ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์Šฌ๋ผ์ด๋“œ/ํŽ˜์ด๋“œ ์•„์›ƒ ๋ฐ ์ •์ง€ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Instagram์—์„œ ์ด ์•Œ๋ฆผ์€ ํƒ์ƒ‰ ๋ชจ์Œ ๋ฐ”๋กœ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. Tumblr์—์„œ ํ•˜๋‹จ ํƒ์ƒ‰ ๋ชจ์Œ ๋ฐ”๋กœ ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค. YouTube์—์„œ๋Š” ์ด์ƒํ•˜๊ฒŒ๋„ ํ•˜๋‹จ ํƒ์ƒ‰ ๋ชจ์Œ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด Shell์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์ œ์•ˆ๋œ ํŒ์—… ์ปจํŠธ๋กค์€ ๊ฐ€๋ณ๊ฒŒ ๋‹ซ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ์กด ์ฐฝ์„ ์˜ค๋ฒ„๋ ˆ์ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์–ธ๊ธ‰ํ•œ ์•Œ๋ฆผ๊ณผ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์•Œ๋ฆผ์€ ๋ถ€๋ชจ ์ฐฝ์„ ์˜ค๋ฒ„๋ ˆ์ดํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ(์ฆ‰, ๋ถ€๋ชจ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ œ์Šค์ฒ˜์— ๋ฐ˜์‘ํ•จ) Popup์ด ์ ํ•ฉํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Shell์€ ์ด View(Notification[View]๋ผ๊ณ  ํ•จ)๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์™€ ๋ฐฐ์น˜ ๋ฐ ์ง„์ž…/์ข…๋ฃŒ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณธ์งˆ์ ์œผ๋กœ Shell, INavigation ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์— ๋‚ด์žฅ๋œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ† ์ŠคํŠธ/์Šค๋‚ต๋ฐ” ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”Œ๋žซํผ๋ณ„๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์ด๋„๋ก ๊ฐ•์š”๋˜์ง€ ์•Š์ง€๋งŒ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

d1c014c0-fc7b-4788-9689-1948a7294426

bc91d3ca-b95f-4485-a917-db6ab47510c1

1.0์—์„œ ๋‚˜์˜จ ๊ตฌ์‹ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ •์„ฑ, ์œ ์—ฐ์„ฑ ๋“ฑ์„ ๋‘˜๋Ÿฌ์‹ผ ๋…ผ์Ÿ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” ListView2๋ฅผ ๋งค์šฐ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@jassmith

  • ์ƒˆ๋กœ์šด ListView์— ๋Œ€ํ•œ ๊ฐœ์„  ํ‹ฐ์ผ“์ด ์•„์ง ์žˆ์Šต๋‹ˆ๊นŒ?
  • v1.0์ด ์–ธ์ œ ๋‚˜์˜ฌ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? EOY์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์„๊นŒ์š”?

๋˜ํ•œ, ๋‚˜๋Š” ํŒ€์ด ๋„ˆ๋ฌด ์ž‘์•„์ง€๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ™์€ ์šฐ๋ ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์˜ˆ์ „์— ์ด๋Ÿฐ ์–˜๊ธฐ๋ฅผ ํ•œ ์ ์ด ์žˆ์–ด์š”. ํŒ€์ด ์•ž์œผ๋กœ ๋” ํฌ๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿ™ @davidortinau @migueldeicaza

@jassmith ์ €๋Š” App ํด๋ž˜์Šค์šฉ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ˜„์žฌ ํƒ€์‚ฌ ํ•ด์ปค๊ฐ€ ๋‹ฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, RgPopups ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์•ฑ์˜ ๊ธฐ๋ณธ ๋ณด๊ธฐ๋ฅผ ์žก๊ณ  ๋ Œ๋”๋ง๋œ ๋ณด๊ธฐ๋ฅผ ์•ฑ์— ์ฃผ์ž…ํ•˜์—ฌ ์ „์ฒด ํ™”๋ฉด ํŒ์—… ๋ชจ์–‘์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ˜„์žฌ "์ˆœ์ˆ˜ํ•œ" Xamarin Forms๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฑ์— ๋ Œ๋”๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์Šค์Šค๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์•Œ๋ฆผ์„ Shell์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์›ํ•˜๋Š” ์œ„์น˜์— ์ž„์˜๋กœ ํŽ˜์ด์ง€๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ  ๋ถ„ํ•  ๋ณด๊ธฐ(๋งˆ์Šคํ„ฐ ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ํƒœ๋ธ”๋ฆฟ/๋ฐ์Šคํฌํ†ฑ/๋…ธํŠธ๋ถ(๋Œ€ํ˜• ํ™”๋ฉด ์žฅ์น˜)์—์„œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: Google ์ง€๋„๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

image

์ฝ˜ํ…์ธ ๊ฐ€ ์ง€๋„ ์œ„์— ์–ด๋–ป๊ฒŒ "๋– ๋‹ค๋‹ˆ๋Š”์ง€" ํ™•์ธํ•˜์‹ญ์‹œ์˜ค(๋ถ„ํ•  ๋ณด๊ธฐ ์—†์Œ). ํƒญ์ด๋‚˜ ๋ถ€๋™ ์˜์—ญ ๋‚ด ํƒ์ƒ‰๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๊ทน๋„๋กœ ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Xamarin Forms๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์ฆ‰์‹œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(ํŽ˜์ด์ง€๋ฅผ ์ค‘์ฒฉํ•  ์ˆ˜ ์—†์Œ ๋‚ด๋ถ€ ๋ณด๊ธฐ). ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ NavigationPage์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ณด๊ธฐ์ธ ์ž์ฒด ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด๊ธฐ๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ ˆ์ด์•„์›ƒ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋งŽ์€ ์ž‘์—…/์–ด๋ ค์šด ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์›ํ•˜๋Š” ๊ณณ์— ์ฝ˜ํ…์ธ (ํŽ˜์ด์ง€ ํฌํ•จ)๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์›ํ•˜๋Š” ์œ„์น˜์— ์ž„์˜๋กœ ํŽ˜์ด์ง€๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@jsiemens ๋Š” ์ด ๋ณด๊ธฐ๊ฐ€ ์ „ํ™”์—์„œ๋Š” ์ œ๋Œ€๋กœ ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ๋ฐ์Šคํฌํ†ฑ ๋ฐ ํƒœ๋ธ”๋ฆฟ์—์„œ๋Š” ๋ฉ‹์ง€๊ฒŒ

@dansiegel ์ ์–ด๋„ ๊ฐœ์ธ์ ์œผ๋กœ VSM ๋˜๋Š” ์ด์™€ ๋™๋“ฑํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ทฐํฌํŠธ ์ž„๊ณ„๊ฐ’(ํ˜„์žฌ GMaps๊ฐ€ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด) ์•„๋ž˜์—์„œ ์Šคํฌ๋กค ๋ณด๊ธฐ๋ฅผ ์ด๋™ํ•˜๊ณ  ์••์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํƒ์ƒ‰ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์‚ฌ์šฉ์ž๋Š” ํƒœ๋ธ”๋ฆฟ๊ณผ ๋” ์ž‘์€ ๋ณด๊ธฐ๋ฅผ ๋‹จ์ผ ํƒ์ƒ‰ ์ด์ •ํ‘œ๋กœ '๋ณผ' ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์€ ํ™”๋ฉด์—๋Š” ๋‘ ๊ฐœ์˜ ์ด์ •ํ‘œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ์ƒ‰์€ ์–ด๋–ป๊ฒŒ๋“  ๋ฐ˜์‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋กœ์„œ ์šฐ๋ฆฌ๋Š” ์ƒํ™ฉ์— ๋งž๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ˜์‘ํ•˜๋Š” ํŠน์„ฑ์„ ํ™•์‹คํžˆ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ทธ๊ฒƒ์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jsiemens @dansiegel ํ˜„์žฌ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ControlTemplate ์ž…๋‹ˆ๋‹ค. ๋‚ด "ํŽ˜์ด์ง€" ์œ ํ˜• ์ฝ˜ํ…์ธ ๋ฅผ ContentView ๋กœ ๋งŒ๋“ค๊ณ  ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ContentPage ( NavigationPage ๋‚ด๋ถ€)์— ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ControlTemplates ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ControlTemplate ์˜ ๋ฐ”์ธ๋”ฉ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผœ๊ฑฐ๋‚˜ ๋„๋Š” ์—ฌ๋Ÿฌ ๋ฐ”์ธ๋”ฉ๋œ ContentViews (์ผ๋ฐ˜์ ์œผ๋กœ Grid ์„ ์˜ค๋ฒ„๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์Œ)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ControlTemplate ์ž์ฒด( DynamicResource ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ). ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ํŽ˜์ด์ง€์— ์žˆ์ง€๋งŒ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ํ•ญ์ƒ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹Œ ์›น ์‚ฌ์ดํŠธ์˜ CSS ํŒจ๋„๊ณผ ์•ฝ๊ฐ„ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ControlTemplate ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งˆ๋ฒ•๊ณผ๋„ ๊ฐ™์œผ๋ฉฐ ๋‚˜๋Š” ๊ทธ๋“ค์˜ ๊ธฐ๋Šฅ์ด Shell์—์„œ ๋ณด์กด๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

@dansiegel ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ์•ฑ์ด ํƒœ๋ธ”๋ฆฟ/๋…ธํŠธ๋ถ/๋ฐ์Šคํฌํ†ฑ์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์‰˜์„ ๋กœ๋“œํ•˜๋„๋ก ์ฝ”๋”ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jsiemens ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ œ ์˜๊ฒฌ์€ ๊ท€ํ•˜์˜ ์•„์ด๋””์–ด๋ฅผ ๋”์šฑ ๊ตฌ์ฒดํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋Œ€ํ™”์™€ ๋น„ํŒ์  ์‚ฌ๊ณ ๋ฅผ ์ด‰์ง„ํ•˜๊ธฐ ์œ„ํ•œ

@dansiegel ์˜ˆ, ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€

์ด ์‚ฌ์–‘์— ๋Œ€ํ•œ ์ฃผ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•(์˜ˆ: @MelbourneDeveloper ์˜ ์„ธ ๋ฒˆ์งธ ์šฐ์„  ์ˆœ์œ„ - ์œ ์—ฐ์„ฑ)์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ ˆ์ด์•„์›ƒ์ž…๋‹ˆ๋‹ค. ์ €์™€ ์ œ ํŒ€์„ ์œ„ํ•œ ๋งˆ์Œ์ž…๋‹ˆ๋‹ค(ํƒ์ƒ‰ ํŽ˜์ด์ง€ ๋ฐ ํƒญ๊ณผ ๊ฐ™์€ 'ํŽ˜์ด์ง€ ์ „์šฉ' ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ˜ํ…์ธ  ํŒจ๋„์„ ์ง€๋„ ์ƒ๋‹จ์— ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋งคํ•‘ ์•ฑ์„ ๊ตฌ์ถ• ์ค‘์ž…๋‹ˆ๋‹ค).

์‰˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์‰˜์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดˆ๊ธฐ ๋ฐ˜์‘์€ ๋‚ด๊ฐ€ ์ด๋ฏธ ํ•  ์ˆ˜ ์—†๋Š” ์ผ์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Xamarin Forms ํŒ€์€ ๋‚ด๊ฐ€ ์ด๋ฏธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ผ์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ณ„์† ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: CSS, Visual State Manager, ์ด์ œ Drawing ๋ฐ Shell ์‚ฌ์–‘). ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ๊ฐ€์ ธ๋‹ค์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ ๋‚ด๊ฐ€ ์ด์ „์— ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ์ •์˜ ์ปจํŠธ๋กค ๋ฐ/๋˜๋Š” ๋ Œ๋”๋Ÿฌ ์™ธ๋ถ€์—์„œ). ์…ธ์ด ๊ตฌ๋ฌธ์ด ๋” ์šฐ์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋‹ต์ด๋ผ๋ฉด ์ €๋Š” ๋ชจ๋‘ ์ฐฌ์„ฑํ•˜์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ์‹ค์ œ๋กœ ๊ฐ€์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ํŽ˜์ด์ง€/๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ํ‘œํ˜„๋ ฅ์ด ๋›ฐ์–ด๋‚˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์œ„์ ฏ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ ˆ์ด์•„์›ƒ ๋‚ด์˜ ๋ชจ๋“  ํ•˜์œ„ ๋ณด๊ธฐ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ xamarin ๋ณด๊ธฐ๋ณ„๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ณด๊ธฐ ์ƒ์„ฑ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ์ข…์˜ ์ž๋™ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ”Œ๋Ÿฌํ„ฐ/์ž๋งˆ๋ฆฐ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ XF ๋ทฐ ๊ทธ๋ฃน์ด ๋‹จ์ผ ํ‘œ๋ฉด์œผ๋กœ ๋ Œ๋”๋ง๋˜๊ณ  ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ ๋ทฐ๋กœ ๋ธ”๋ฆฌํŠธ๋ฉ๋‹ˆ๋‹ค. Android ๋ณด๊ธฐ ์ƒ์„ฑ/๋ ˆ์ด์•„์›ƒ C# -> Java interop ๋น„์šฉ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง„ํ–‰์ค‘!!

@jassmith ์…ธ ์ข…๋ฃŒ ํ›„, ํ•จ๊ป˜ ์ถ”์ฒจํ•˜๋‚˜์š”?

์‰˜์€ macos์™€ wpf๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

@juepiezhongren ์ดˆ๊ธฐ ๋Œ€์ƒ์€ iOS ๋ฐ Android์ž…๋‹ˆ๋‹ค. ๊ทธ ํ›„์— ๋‹ค๋ฅธ ํ”Œ๋žซํผ์ด ์šฐ์„  ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋„๋ฉด์€ ํ˜„์žฌ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์‚ฌ์–‘์—์„œ๋Š” Shell์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Xamarin.Forms ๋‚ด์—์„œ SkiaSharp ๋ฐ Skia ๊ธฐ๋ฐ˜ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์žฌ๋ฃŒ ๋ฐ ๊ธฐํƒ€ ๋””์ž์ธ ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ๋””์ž์ธ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์ „๋žต์„ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@davidortinau ์‰˜์ด RTL์„ ๋” ์ž˜ ์ง€์›ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๊นŒ?

์–ด๋–ค ๋ฉด์—์„œ ๋” ๋‚˜์€๊ฐ€์š”? ํ˜„์žฌ RTL ์ง€์›์—์„œ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•˜๋ฉด ํ•œ๋™์•ˆ XF ๊ฐœ๋ฐœ์„ ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์ œํ•œ ์‚ฌํ•ญ์€ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. #1222 ๋ฐ #2448์„ ์‚ดํŽด๋ณด์„ธ์š”.

์‰˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ œํ•œ ์‚ฌํ•ญ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • NavigationPage ๋ฒ„ํŠผ ์œ„์น˜, ๋„๊ตฌ ๋ชจ์Œ ํ•ญ๋ชฉ ์œ„์น˜ ๋ฐ ์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ํ˜„์žฌ FlowDirection ์„ค์ •์ด ์•„๋‹Œ ์žฅ์น˜ ๋กœ์บ˜์— ์˜ํ•ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค.
  • FlowDirection์— ๋Œ€ํ•œ ์ „์—ญ ์•ฑ ์„ค์ •

๊ธฐํƒ€ ํ”Œ๋žซํผ๋ณ„ ์ œํ•œ ์‚ฌํ•ญ

Xamarin.Forms์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์• ์ดˆ์— ์ด๋ ‡๊ฒŒ ์ง€์–ด์กŒ์–ด์•ผ ํ–ˆ๋‹ค.

๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ์ง€ ์•Š๊ณ  xf๋Š” ์—ฌ์ „ํžˆ ๋งŽ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

@juepiezhongren

๊ทธ๋ƒฅ Skiasharp๋ฅผ ์‚ฌ์šฉ

@mackayn ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค
https://github.com/xamarin/Xamarin.Forms/issues/1789
๋ณดํŽธ์  ์ธ ์™ธ๋ชจ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค

Adam์€ ํŽ„์ฉ ๋›ฐ์—ˆ์Šต๋‹ˆ๋‹ค. xamarin์ด ์›๋ž˜ ํ›จ์”ฌ ๋” ๋‚˜์€ ํ‰ํŒ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋˜ xf์—๊ฒŒ๋Š” ์ •๋ง ์Šฌํ”ˆ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

xamarin.native๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋˜๋Š” ํ”Œ๋Ÿฌํ„ฐ ๋ฐ˜์‘์— ๊ด€๊ณ„์—†์ด ๋‹ค๋ฅธ ํ”Œ๋žซํผ ๊ฐ„ ์†”๋ฃจ์…˜๋ณด๋‹ค xf์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ๊ฒฌ๊ณ ํ•ฉ๋‹ˆ๋‹ค. dotnet ์• ํ˜ธ๊ฐ€๋กœ์„œ xf์˜ ํ˜„์žฌ ์ƒํ™ฉ์€ ํ•ญ์ƒ ์•ฝ๊ฐ„ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@juepiezhongren

์ด ๋…ผ์˜๋Š” ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Flutter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ(Flutter๊ฐ€ ์žˆ๋Š” iOS ๋ฐ Android๋งŒ ํ•ด๋‹น)์— ๊ฑธ์ณ ์•ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์€ ์ผ๊ด€๋œ ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์„ ๋” ๋‹ฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•œ ์ž‘์€ ๋ถˆํ‰, ๊ทธ๋ƒฅ ๋„ˆ๋ฌด. ์—ฌ์ „ํžˆ ๋งŒ์„ธ!

๋‚˜๋Š” Skia๊ฐ€ Telerik์ด ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Forms API์— ํ›จ์”ฌ ๋” ๋งŽ์ด ๊ตฌ์›Œ์ง€๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ Shell & CollectionView์— ๋…ธ๋ ฅ์„ ํˆฌ์žํ•˜๊ณ  ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ชจ๋‘๋“ค ๋งํ•ด์ฃผ์„ธ์š”. ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์–ธ์–ด์— ๋Œ€ํ•ด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ”Œ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”,

์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ž‘์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ œ๊ฐ€ ์ข€ ๋Šฆ์—ˆ์ง€๋งŒ ๋„ค์ด๋ฐ์ด ์ข€ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

  1. ํ•ญ๋ชฉ, ์„น์…˜ ๋ฐ ์ฝ˜ํ…์ธ ๋Š” ๋ชจ๋‘ ์‹ค์ œ๋กœ ์ผ๋ฐ˜์ ์ธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ์–ด๋–ค ๊ด€๊ณ„์— ์žˆ๋Š”์ง€ ๋‹น์žฅ์€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  => ์„น์…˜ => ํ•ญ๋ชฉ ๋˜๋Š” ์„น์…˜ => ์ฝ˜ํ…์ธ  => ํ•ญ๋ชฉ ๋˜๋Š” ํ•ญ๋ชฉ => ์„น์…˜ => ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๊นŒ?
    ๋”ฐ๋ผ์„œ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ„์„ ์ฐพ์•„ ๋‹ค๋ฅธ "์‚ฌ๋ฌผ"์ด ๋ฌด์—‡์ธ์ง€ ์ข€ ๋” ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ๋‹ค์Œ ์ž…๋ ฅ์œผ๋กœ ์ด๋•๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‚ด๋ถ€ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ Shell์ด โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๋ถ€์— "ShellItem" ๋Œ€์‹  "Item"๊ณผ ๊ฐ™์€ ์ง์ ‘์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  "๊ฒƒ๋“ค" Shelltem, ShellSection ๋“ฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ๋ถˆํ•„์š”ํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์•ผ

2018๋…„์—๋„ ์ถœ์‹œ๋˜๋‚˜์š”?

์ง€๊ธˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ช‡ ๊ฐ€์ง€ ํ›Œ๋ฅญํ•œ ์ƒ˜ํ”Œ์„ ๋ณด๋ ค๋ฉด https://blog.xamarin.com/connect-2018-xamarin-announcements/ ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

Android 9๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•œ๊ฐ€์š”? ์กฐ๊ธˆ์€ ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๊ฝค ์ข‹๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ ์ˆœ์ „ํžˆ UI ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
์‹œ๋„ํ•  ๋•Œ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ดˆ๊ธฐ ๊ด€์‹ฌ์‚ฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋˜๋Š” ์ฝ”๋“œ(์˜ˆ: Bluetooth ์—ฐ๊ฒฐ ์žฅ์น˜์—์„œ ์ˆ˜์‹ ๋œ ๋ฉ”์‹œ์ง•)์—์„œ ํŽ˜์ด์ง€ ๋ณ€๊ฒฝ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด์„œ ์ ์ ˆํ•œ ๋ถ„๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํƒ์ƒ‰์„ ๊ตฌ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

@hassanrahimi

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ชจ๋‘๋“ค ๋งํ•ด์ฃผ์„ธ์š”. ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์–ธ์–ด์— ๋Œ€ํ•ด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ”Œ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

RTL์ด ์ง€์›๋˜๋Š” ๋™์•ˆ ํ”Œ๋ผ์ด์•„์›ƒ ๋ฉ”๋‰ด๋Š” ์—ฌ์ „ํžˆ ์™ผ์ชฝ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ˜„์žฌ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‹จ ํƒญ๋ฐ” UI๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์‰˜ ๋‚ด๋ถ€๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š๋Š” ์ปจํŠธ๋กค์„ ์‰˜์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด FAB..

@stfnilsson ํ•˜๋‹จ

MaterialShell์— ๋Œ€ํ•ด FAB์™€ ๊ฐ™์ด ์„ค๋ช…ํ•  ๋•Œ ๊ธ€๋กœ๋ฒŒ ์ปจํŠธ๋กค์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. FAB ์™ธ์— ์ด๋กœ๋ถ€ํ„ฐ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฒซ์งธ: ์ด์ „์— ๋‚ด ์ž์‹ ์˜ ์‰˜์„ ์‚ฌ์šฉํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚ด ์‰˜์„ ๊ท€ํ•˜์˜ ์‰˜๋กœ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚œ ์ •๋ง ์ข‹์•„.

์•„๋งˆ๋„ ์‰˜๊ณผ ๊ด€๋ จ์ด์—†๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ๋ก€ 1:
๋งค์šฐ ๋งž์ถคํ˜• ๋ฉ”๋‰ด๊ฐ€ ์žˆ๋Š” ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์•ฑ์˜ ๊ฐ ๋ชจ์„œ๋ฆฌ์— ํ•˜๋‚˜์˜ ๋ฉ”๋‰ด ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ•˜์—ฌ ์…ธ์˜ ์ผ๋ถ€๊ฐ€ ๋˜๋„๋ก ํ•ฉ๋‹ˆ๊นŒ(์˜ˆ: ์˜ค๋ฒ„๋ ˆ์ด ๋˜๋Š” ๋นŒ๋ณด๋“œ). ํƒ์ƒ‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ๋ก€ 2:
์‰˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ํ•˜๋‹จ ํƒญ๋ฐ”๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜์—ฌ ๊ฐ€์šด๋ฐ ๋ฒ„ํŠผ์ด ๋” ๋†’๊ฒŒ(๊ฐ€์šด๋ฐ ์ œ๊ธฐ ๋ฒ„ํŠผ์ด๋ผ๊ณ  ํ•จ) ํ‘œ์‹œ๋˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•˜๋‹จ ํƒ์ƒ‰ ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉ์ž ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด์™€ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์— ์‰˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋ฌผ๋ก  ๊ฐ ํ”Œ๋žซํผ์—์„œ ํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•˜์ง€๋งŒ ๋ฉ”๋‰ด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ณด์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค..

์—ฌ๊ธฐ ๋‚ด ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค( Xamarin.Forms 4.0.0.8055-pre1 ).

   <Shell.FlyoutHeader>
        <local:FlyoutHeader />
    </Shell.FlyoutHeader>

    <ShellItem Title="Home" Icon="home.png">
        <ShellSection>
            <ShellContent>
                <local:MainPage />
            </ShellContent>
        </ShellSection>
    </ShellItem>

    <ShellItem Title="Notifications" Icon="notification.png">
        <ShellSection>
            <ShellContent Title="Recent">
                <local:NotificationPage />
            </ShellContent>
        </ShellSection>
    </ShellItem>

    <ShellItem Title="Test" Icon="icon.png">
        <ShellSection Title="Home" Icon="home.png">
            <ShellContent>
                <local:MainPage />
            </ShellContent>
        </ShellSection>

        <ShellSection Title="Notifications" Icon="notification.png">
            <ShellContent Title="Recent">
                <local:NotificationPage />
            </ShellContent>

            <ShellContent Title="Settings">
                <local:SettingsPage />
            </ShellContent>
        </ShellSection>
    </ShellItem>

ํ–„๋ฒ„๊ฑฐ ๋ฉ”๋‰ด๋ฅผ ํƒญํ•˜๋ฉด ๋ชจ๋‘ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Test ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•˜์—ฌ Home ๋ฐ Notifications ๋ฅผ ์•ž๋’ค๋กœ ๋ˆ„๋ฅด๊ณ  Recent ๋˜๋Š” Settings ์ค‘์—์„œ ์„ ํƒํ•˜๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๊ฐ๊ฐ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ–„๋ฒ„๊ฑฐ ๋ฉ”๋‰ด๋ฅผ ๋‹ค์‹œ ํƒญํ•˜๋ฉด ์•ฑ์ด ๋‹ค์šด๋ฉ๋‹ˆ๋‹ค.

image

GroupHeaderTemplate ์„ ์‚ฌ์šฉํ•˜์—ฌ ShellItem์— ์žˆ๋Š” ShellContent ๊ทธ๋ฃน์˜ ์ œ๋ชฉ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ Xamarin Forms๋Š” ํ˜„์žฌ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ๋ณต์žก์„ฑ์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jassmith ์˜๋„๋Š” ์‰˜์ด ์•„๋‹Œ ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜

Shell์ด โ€‹โ€‹์™„๋ฃŒ๋˜๋ฉด ํ–ฅํ›„ ๊ฐ๊ฐ€์ƒ๊ฐ๋  ์ˆ˜ ์žˆ๋Š” ์‚ฌํ•ญ์€ ๋ฌด์—‡์ด๋ฉฐ ์™„๋ฃŒ๋˜๋ฉด Xamarin Forms์˜ ์ „์ฒด ๋ณต์žก์„ฑ์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๊นŒ? ContentPage๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ํŽ˜์ด์ง€๋Š” ๊ฐ๊ฐ€์ƒ๊ฐ๋ฉ๋‹ˆ๊นŒ?

์ „๋žต์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ฒƒ์„ ์–ป๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Core Repo์˜ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ง€๊ด€๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Shell์ด โ€‹โ€‹ShellPage๋ผ๊ณ  ๋ถˆ๋ฆฌ์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด? ๋‹ค๋ฅธ Page ํด๋ž˜์Šค์—๋Š” "Page"๋กœ ๋๋‚˜๋Š” ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Shell์— ๋Œ€ํ•œ ํ˜„์žฌ ๊ด‘๊ณ ( https://blog.xamarin.com/xamarin-forms-4-0-preview/ )๋Š” ์œ ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ๋†’์€ ์ˆ˜์ค€์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋‹จ์ˆœํ™”๋œ ๋ฐฉ๋ฒ•

์ด๊ฒƒ์€ Xamarin์„ ์‹ค์ œ ๋ชฉ์  ์ด์ƒ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜์—๋Š” Xamarin์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ ˆ์ด์•„์›ƒ์— ๊ด€ํ•œ ๊ฒƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ํƒ€๊ฒŸ ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ๊ณตํ†ต UI ํƒ์ƒ‰ ํŒจํ„ด์˜ ๊ณ„์ธต

Xamarin.Forms๊ฐ€ ๋ฐ์Šคํฌํ†ฑ๋„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— "๋ชจ๋ฐ”์ผ"์ด ์ž˜๋ชป ์ธ์‡„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  1. ๊ฐ•๋ ฅํ•œ ํƒ์ƒ‰ ์„œ๋น„์Šค

Xamarin.Forms์—๋Š” ํƒ์ƒ‰์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํƒ์ƒ‰์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‚ด์žฅํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํƒ์ƒ‰์— ๋Œ€ํ•œ ๋งŽ์€ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ€์ƒ๊ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @charlesroddie , ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Shell์ด โ€‹โ€‹ํ˜„์žฌ ๊ท€ํ•˜์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์•ฑ์— ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Shell์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ Shell ์‚ฌ์–‘์€ ๊ฐœ๋ฐœ์ž ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ ๋ชฉ์ ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ Xamarin.Forms์—์„œ๋Š” TabbedPage, MasterDetailPage, ํƒญ ๋ฐ ๋ฉ”๋‰ด ํ•ญ๋ชฉ, ๋‹ค์–‘ํ•œ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜, ์ฝ˜ํ…์ธ  ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ด๋ฏธ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” "๊ฑด์ถ•"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค. Shell์€ ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค(Shell ์‚ฌ์šฉ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ).

"๋ชจ๋ฐ”์ผ"์€ ์ž˜๋ชป ์ธ์‡„๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ๋งค์šฐ ๊ณ ์˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Shell์€ iOS ๋ฐ Android๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ Shell์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐ์Šคํฌํ†ฑ ๋ฐฑ์—”๋“œ์— Shell ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ธฐ์—ฌ์ž๋“ค์˜ ๊ด€์‹ฌ์„ ๋“ค์—ˆ๊ณ , ๊ทธ๋Ÿฌํ•œ PR์€ ํ˜ธํ‰์„ ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” Shell์ด โ€‹โ€‹๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ข‹์€ ์œ„์น˜์— ์žˆ์œผ๋ฉฐ, ๊ธ‰๊ฒฉํ•œ UI ํŒจํ„ด ๋ณ€๊ฒฝ์—๋„ ์ ์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ(๋ณต์›๋ ฅ)์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(๋ˆ„๊ฐ€ ํ–ฅํ›„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ฑ„ํƒ๋ ์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ). ์˜ค๋Š˜์˜ ์‹œํ—˜์žฅ์€ iOS์™€ Android์ž…๋‹ˆ๋‹ค.

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

๋ฐ์Šคํฌํ†ฑ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ Shell์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค... Shell์€ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ข‹์€ ์œ„์น˜์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Xamarin์ด ์ž์ฒด ๋ฌด๊ฒŒ๋กœ ๋ฌด๋„ˆ์ง€๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Shell์ด โ€‹โ€‹๋ชจ๋“  ํ”Œ๋žซํผ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„์—๋Š” ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ถ„๋ช…ํžˆ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฑ„ํƒํ•˜๋ ค๊ณ  ํ•˜๋Š” ์‹œ๊ธฐ์— ๋ฐ์Šคํฌํƒ‘ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฉ”์‹œ์ง• ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Xamarin์€ CSS์™€ ๊ฐ™์€ ๋งŽ์€ ๊ธฐ๋Šฅ ํฌ๋ฆฌํ”„๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ˜‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์กฐ์ง์˜ ์ผ๋ถ€ ์˜์‚ฌ ๊ฒฐ์ •๊ถŒ์ž๊ฐ€ ์ด ์ ์„ ์ดํ•ดํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Xamarin์ด ์ž์ฒด ๋ฌด๊ฒŒ๋กœ ๋ฌด๋„ˆ์ง€๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Shell์ด โ€‹โ€‹๋ชจ๋“  ํ”Œ๋žซํผ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„์—๋Š” ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ถ„๋ช…ํžˆ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฑ„ํƒํ•˜๋ ค๊ณ  ํ•˜๋Š” ์‹œ๊ธฐ์— ๋ฐ์Šคํฌํƒ‘ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฉ”์‹œ์ง• ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Xamarin์€ CSS์™€ ๊ฐ™์€ ๋งŽ์€ ๊ธฐ๋Šฅ ํฌ๋ฆฌํ”„๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ˜‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์กฐ์ง์˜ ์ผ๋ถ€ ์˜์‚ฌ ๊ฒฐ์ •๊ถŒ์ž๊ฐ€ ์ด ์ ์„ ์ดํ•ดํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค. ๊ธฐ๋Šฅ์ด ๋ฐ์Šคํฌํ†ฑ(UWP)์—์„œ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. CSS์— ๋Œ€ํ•ด์„œ๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณต์žก์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋งŽ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ํ›จ์”ฌ ๋” ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ชจ๋“  ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ œ์–ด์™€ ๊ธฐ์กด ์ œ์–ด์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Shell์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์™„์ „ํžˆ ์ฑ„ํƒํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ „ํ˜€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ ์ˆ˜์ค€์—์„œ๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ Page ์ธํ”„๋ผ์™€ ๋™์ผํ•œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์ œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ๋ณต์žกํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‰˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ”Œ๋ผ์ด์•„์›ƒ ๋ฉ”๋‰ด๋งŒ ๊ฐ–๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…ธ ํ•ญ๋ชฉ์ด ๋งคํ•‘๋˜๋Š” ์ปจํŠธ๋กค์˜ ์–‘์ด ๊ทนํžˆ ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํƒญ, ํƒ์ƒ‰ ํŽ˜์ด์ง€ ๋ฐ ํ”Œ๋ผ์ด์•„์›ƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Xamarin Forms๊ฐ€ UWP์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ์ปจํŠธ๋กค์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ณ  UWP์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปจํŠธ๋กค ์ง‘ํ•ฉ์œผ๋กœ ๋…ธ์ถœ๋˜๊ณ  ์“ธ๋ฐ์—†๋Š” ํŒฝ์ฐฝ(์˜ˆ: CSS)์ด ์—†๋‹ค๋ฉด ์ €๋Š” ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ช‡ ๊ฐ€์ง€ ํƒ€๋‹นํ•œ ์ ์„ ์ง€์ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, UWP/iOS/Android ์•ฑ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ Shell์ด โ€‹โ€‹UWP๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋ž˜์—๋Š” "์•„๋งˆ๋„"๋งŒ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์„ ๋•Œ ์•ฝ๊ฐ„ ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋Š” Shell์˜ ์š”์ ์„ ๋†“์น˜๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์šฉ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์•„์ฃผ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฐœ๋ฐœ์ž๋กœ์„œ ... UWP๊ฐ€ ํ•„์š”ํ•˜๊ณ  XF๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ ์œ„ํ•ด UWP ์ง€์›์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ์Šต๋‹ˆ๋‹ค ... ํ•˜์ง€๋งŒ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ... ๋˜ํ•œ ๋” ๋ณต์žกํ•œ ํƒ์ƒ‰ ๋“ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‰˜์ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํƒ์ƒ‰๊ณผ ํŽ˜์ด์ง€๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค. ์•Œ์•„๋‚ด๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ๋˜ํ•œ ๋งค์šฐ ๋ณต์žกํ•œ LOB(Line of Business) ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ˆ˜์ค€์˜ ๋ณต์žก์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ˆ˜๋งŽ์€ ๊ฐ„๋‹จํ•œ ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. XF๋Š” Flutter ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์— ๋Œ€ํ•ญํ•˜์—ฌ ์™„์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ง„ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ทธ๊ฒƒ์„ ์ฑ„ํƒํ•˜๋„๋ก ๊ณ„์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”Œ๋žซํผ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•๋ณดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ UWP๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ–ฅํ›„ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ๋Š”๋ฐ Shell์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ณ ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” 2.3 ๋ฆด๋ฆฌ์Šค ์ดํ›„๋กœ XF๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ•ด์•ผ ํ•  ์ผ์ด ๋” ๋งŽ์ง€๋งŒ... ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ํ”Œ๋žซํผ์€ ํฌ๊ฒŒ ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค...์ ์–ด๋„ ์ €์—๊ฒŒ๋Š”...๊ทธ๋ž˜์„œ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์—ญ์‚ฌ์ ์œผ๋กœ XF ํŒ€์€ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ๋งค์šฐ ์˜์‹ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ํ†ต์ œํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ์— ์ถ”๊ฐ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด์ „ ๋ฐฉ๋ฒ•์ด ๊ฐ€์น˜๊ฐ€ ๋–จ์–ด์ง€๊ณ  ์ด์ „ ๋ฌธ์„œ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Flutter๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ์—… ์–ธ์–ด๊ฐ€ ์—†์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ฝ”๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. Xamarin์€ ๋” ๋ณต์žกํ•˜๊ณ  ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์•„ ๊ฒฝ์Ÿํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ดˆ์ ์œผ๋กœ Flutter(๋” ๋งŽ์€ ํ”Œ๋žซํผ)๋ณด๋‹ค ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฝ์Ÿํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด Core์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ์ค‘์ ์„ ๋‘๊ณ  ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ด์™ธ์˜ ํŽ˜์ด์ง€ ๋˜๋Š” ์…ธ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  XAML ๋˜๋Š” CSS ๋˜๋Š” ์†์„ฑ ๋ฐ”์ธ๋”ฉ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” Xamarin.Core๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์ด๋ฅด๋ €์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜„์žฌ ๋ฒ„๊ทธ ๋น„์œจ์„ ์ˆ˜์šฉํ•˜๋Š” ๋น„์šฉ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์žˆ๋Š” Xamarin.Extensions๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด์ „ ๋ฐฉ๋ฒ•์ด ๊ฐ€์น˜๊ฐ€ ๋–จ์–ด์ง€๊ณ  ์ด์ „ ๋ฌธ์„œ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Flutter๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ์—… ์–ธ์–ด๊ฐ€ ์—†์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ฝ”๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. Xamarin์€ ๋” ๋ณต์žกํ•˜๊ณ  ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์•„ ๊ฒฝ์Ÿํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ดˆ์ ์œผ๋กœ Flutter(๋” ๋งŽ์€ ํ”Œ๋žซํผ)๋ณด๋‹ค ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฝ์Ÿํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด Core์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ์ค‘์ ์„ ๋‘๊ณ  ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ด์™ธ์˜ ํŽ˜์ด์ง€ ๋˜๋Š” ์…ธ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  XAML ๋˜๋Š” CSS ๋˜๋Š” ์†์„ฑ ๋ฐ”์ธ๋”ฉ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” Xamarin.Core๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์ด๋ฅด๋ €์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜„์žฌ ๋ฒ„๊ทธ ๋น„์œจ์„ ์ˆ˜์šฉํ•˜๋Š” ๋น„์šฉ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์žˆ๋Š” Xamarin.Extensions๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@charlesroddie ์œ„์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์€ XAML์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•œ ๊ฒƒ์ด
์ฝ”๋”ฉ๋œ UI๊ฐ€ Xamarin.Forms๋กœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Re Flutter๋Š” ๋งค์šฐ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” iOS ๋ฐ Android๋ฟ์ž…๋‹ˆ๋‹ค. macOS, Windows 7/8.1 ๋ฐ Linux๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ €์—๊ฒŒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Xamarin.Forms๋ฅผ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค!

์‚ฌ์šฉ์ž ์ •์˜ ๋ณด๊ธฐ๋ฅผ ๋งˆ์Šคํ„ฐ ํŽ˜์ด์ง€๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. MenuItem ๋˜๋Š” ํŽ˜์ด์ง€๋งŒ ์„ ํ˜ธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Xamarin Mac ๋ฐ uwp ์ง€์›?

ํƒ์ƒ‰ ํ”„๋กœ์„ธ์Šค์— ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•Œ๊ณ  ๊ณ„์‹œ๊ฒ ์ง€๋งŒ Prism์„ ์˜ˆ๋กœ ๋“ค๋ฉด ๋ทฐ ๋ชจ๋ธ์€ DI ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ์ž๋™์œผ๋กœ ์š”์ฒญ๋œ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ BindingContext๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋ณด๊ธฐ ๋ชจ๋ธ์— INavigatedAware ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋กœ๋“œ, ์„œ๋น„์Šค ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™” ๋“ฑ๊ณผ ๊ฐ™์€ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ ์ถ”์ธก์€ OnNavigating ๋ฐ OnNavigated Shell ์ด๋ฒคํŠธ์˜€์ง€๋งŒ Current ๋ฐ Target ๋Š” ShellItem์„ ๋…ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทœ์น™์— ๋”ฐ๋ผ BindingContext๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ทฐ ๋ชจ๋ธ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•œ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: #5166์— ์˜ํ•ด ์ถ”์ ๋จ.

์ด ์‰˜์˜ ์•„์ด์ฝ˜์— ๊ทธ๋ฆผ ๋Œ€์‹  "์•„์ด์ฝ˜ ๊ธ€๊ผด"์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ์ง„์˜ ๋Ÿฐํƒ€์ž„ ์ค‘ ์ƒ‰์ƒ ๋ณ€๊ฒฝ์ด ์–ด๋ ต๊ณ  ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ํ•ด์ƒ๋„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. SkiaSharp ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ Œ๋”๋ง๋œ Material Design ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„์ด์ฝ˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ํด๋ž˜์Šค๋Š” ๋น„๊ต์  ์‰ฝ๊ณ  ์‰˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ด์ฝ˜์„ ๋งŽ์ด ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@vincentwx ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์•„์ด์ฝ˜ ๊ธ€๊ผด์€ ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ์‰ฝ๊ณ  ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

@vincentwx @stevehurcombe ์ ˆ๋Œ€์ ์œผ๋กœ. ์ง€๊ธˆ ์•ฑ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

<ShellItem>
    <ShellContent Title="Upcoming" 
                      ContentTemplate="{DataTemplate pages:UpcomingPage}">
            <ShellContent.Icon>
                <FontImageSource Glyph="{x:Static local:IconFont.Rocket}" 
                                 FontFamily='{OnPlatform iOS="Font Awesome 5 Free", Android="fa-solid-900.ttf#Font Awesome 5 Free"}'
                                 Size="18"/>
            </ShellContent.Icon>
        </ShellContent>

        <ShellContent Title="Latest" 
                      ContentTemplate="{DataTemplate pages:LatestPage}">
            <ShellContent.Icon>
                <FontImageSource Glyph="{x:Static local:IconFont.Book}" 
                                 FontFamily='{OnPlatform iOS="Font Awesome 5 Free", Android="fa-solid-900.ttf#Font Awesome 5 Free"}'
                                 Size="18"/>
            </ShellContent.Icon>
        </ShellContent>

        <ShellContent Title="Company" 
                      ContentTemplate="{DataTemplate pages:CompanyPage}">
            <ShellContent.Icon>
                <FontImageSource Glyph="{x:Static local:IconFont.Building}" 
                                 FontFamily='{OnPlatform iOS="Font Awesome 5 Free", Android="fa-solid-900.ttf#Font Awesome 5 Free"}'
                                 Size="18"/>
            </ShellContent.Icon>
        </ShellContent>
    </ShellItem>

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ธ€๋ฆฌํ”„์˜ ์ •์  ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://andreinitescu.github.io/IconFont2Code/

iOS ์ƒ‰์ƒ์— ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. #5071

Xamarin Mac ๋ฐ uwp ์ง€์›?

์ง€๊ธˆ์€ @mdonogma๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ ํ”Œ๋žซํผ ์ง€์›์— ๋Œ€ํ•œ ๊ด€์‹ฌ/์ˆ˜์š”๋ฅผ ๋ชจ์œผ๊ณ  ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๋กœ๋“œ๋งต์— ์—†์Šต๋‹ˆ๋‹ค.

@davidortinau ์ฝ”๋“œ์™€ ๋งํฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Android 8.0์—์„œ๋Š” Shell Content์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” WebView ์š”์†Œ์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋กคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Xamarin Shell ์—†์ด๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ž๋งˆ๋ฆฐ ์–‘์‹ 4.0.0.135214-pre4

ํ•˜๋‹จ ํƒญ๊ณผ ์ œ๋ชฉ ๋ณด๊ธฐ์˜ FontFamily๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@varyamereon ์–ด์ œ ๊ทธ๋žฌ์–ด์š”. FontFamily๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์…ธ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ํ™•์žฅ๋œ Shell์„ GitHub์— ๊ณง ๊ฒŒ์‹œํ•  ์˜ˆ์ •์ด์ง€๋งŒ:

์‚ฌ์šฉ์ž ์ง€์ • ์…ธ ๋งŒ๋“ค๊ธฐ:

<Shell
    x:Class="X.Mobile.App.Features.AppShell.AppShell"

๊ทธ๋Ÿฐ ๋‹ค์Œ Shell ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

[assembly: ExportRenderer(typeof(AppShell), typeof(AppShellRenderer))]

namespace X.Mobile.App.iOS.Renderers
{
    [Preserve(AllMembers = true)]
    public class AppShellRenderer : ShellRenderer
    {
        protected override IShellItemRenderer CreateShellItemRenderer(ShellItem item)
        {
            return new CustomMenuRenderer(this)
            {
                ShellItem = item
            };
        }

๊ทธ ๋‹ค์Œ์—:

 namespace X.Mobile.App.iOS.Renderers
 {
     [Preserve(AllMembers = true)]
     public class CustomMenuRenderer : ShellItemRenderer
     {
         private SKCanvasView _skiaSharpPaintView;
         public CustomMenuRenderer(IShellContext context) : base(context)
         {
         }

public override void ViewDidLoad()
{
}           
public override void ViewWillLayoutSubviews()
{
{

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธ€๊ผด ํŒจ๋ฐ€๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด: _(์ž์ฃผ ํ•˜์ง€ ๋งˆ์„ธ์š”)_

var txtAttributes = new UITextAttributes
            {
                Font = UIFont.FromName("MyriadPro-Semibold", 12.0F)
            };
            foreach (var uiTabBarItem in TabBar.Items)
            {
                uiTabBarItem.SetTitleTextAttributes(txtAttributes, UIControlState.Normal);
            }

์•„๋ž˜์—์„œ ํŒ์—…์„ ์ง€์›ํ•˜์—ฌ Shell์„ ํ™•์žฅํ•œ ์‚ฌ๋žŒ(ํ•˜๋‹จ ์‹œํŠธ)์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋‚ด ์ด์ „ Shell์—์„œ ์ƒˆ Shell(๋ฌผ๋ก  ๊ตฌ์„ฑ)๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. 5์›”์— ์ถœ์‹œ๋  ์•ฑ์—๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค :-) (Xamarin ์ฝ”๋“œ๋„ ๋””๋ฒ„๊น…ํ•ฉ๋‹ˆ๋‹ค)

๋ชฉ๋ก์„ Shell.MenuItems์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ง€์›๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด BindableLayout์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋•Œ๋กœ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ชฉ๋ก์„ ๋กœ๋“œํ•˜๊ณ  ์ด๋ฅผ ๋ฉ”๋‰ด๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ธฐ๋Š” ๊ฐ™์ง€๋งŒ ์„ ํƒํ•œ ๋ฉ”๋‰ด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์…ธ์„ ์‚ฌ์šฉํ•  ๋•Œ Android์—์„œ OffscreenPageLimit์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ๋‚ด ์•ฑ์— ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ ๋‚ด๊ฐ€ Shell์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ ์š”์ฒญ:

  1. ์…ธ ์ˆ˜์ค€์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€ ์ œ๋ชฉ์— ๋Œ€ํ•ด FontFamily๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ

  2. ์…ธ ์ˆ˜์ค€์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€ ์ œ๋ชฉ/ํƒ์ƒ‰ ๋ง‰๋Œ€ ๋“ฑ์— ๋Œ€ํ•œ ์ œ๋ชฉ/ํƒ์ƒ‰ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ

GroupBehavior๋Š” pre4์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<ShellItem GroupBehavior="ShowTabs" FlyoutIcon="stuff.png" Title="Discussion">...
๊ฒฐ๊ณผ:

xxx/Shell/Shell.xaml(14,14): ์˜ค๋ฅ˜: ์œ„์น˜ 108:14. 'GroupBehavior'์— ๋Œ€ํ•œ ์†์„ฑ, ๋ฐ”์ธ๋”ฉ ๊ฐ€๋Šฅํ•œ ์†์„ฑ ๋˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ฐ’๊ณผ ์†์„ฑ ๊ฐ„์— ์œ ํ˜•์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

GroupHeaderTemplate์€ ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ํ™œ์„ฑํ™”๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

MenuItems.Add(item)๋ฅผ ํ†ตํ•ด ํ•ญ๋ชฉ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” MenuItems๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ํ”Œ๋ผ์ด์•„์›ƒ์ด ๋‹ค์‹œ ํ‘œ์‹œ๋  ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๊นŒ?

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

cs ํŒŒ์ผ์—์„œ ์…ธ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๋Š” dbwelch์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋‰ด ํ•ญ๋ชฉ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ShellItems & ShellSections์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ผ์ด์•„์›ƒ์„ ์ผœ๊ณ  ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋ฉด Android์—์„œ ํ–„๋ฒ„๊ฑฐ ๋ฉ”๋‰ด๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  iOS์—์„œ๋Š” ํ•ด๋‹น ์ง€์ ์„ ํด๋ฆญํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€๋งŒ ์•„์ด์ฝ˜์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์•„์ด๋””์–ด?

@KyleTraynor ์ด์— ๋Œ€ํ•œ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 3bar.png ๋ฐ [email protected] ์ด๋ฏธ์ง€๋ฅผ iOS ๋ฆฌ์†Œ์Šค ํด๋”์— ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ๋ฒˆ๋“ค ํ•ญ๋ชฉ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜์—์„œ ์ฐพ์€ ์ด๋ฏธ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
3bar 2x
3bar

@melucas ๋„์™€์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋ ค๊ณ  ๋ฏธ์ณ ๊ฐ€๊ณ  ์žˆ์—ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Shell์„ ์‚ฌ์šฉํ•  ๋•Œ Android์šฉ OffscreenPageLimit์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

1 ShellSection ๋‚ด๋ถ€์— 4๊ฐœ์˜ ShellContents๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ์ƒ์œ„ ํƒญ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ iOS์—์„œ๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ Android์—์„œ๋Š” ์›ํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒดํ•  ๋•Œ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ด ๊ณ ์œ ์˜ ํƒญ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OffscreenPageLimit์„ ์„ค์ •ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Shell์—์„œ๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@davidortinau ํŽ˜์ด์ง€ ์ œ๋ชฉ, ํ•˜๋‹จ ๋ฐ ์ƒ๋‹จ ํƒญ์— ๊ธ€๊ผด ๋ชจ์Œ์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ๊ธ€๊ผด์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ios ๋ฐ android์šฉ ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ”Œ๋ผ์ด์•„์›ƒ ์…ธ์—์„œ ํ•ญ๋ชฉ์„ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‚ด ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ง„์ง€ํ•œ ์•ฑ์ด ์ด ๊ธฐ๋Šฅ ์—†์ด ์–ด๋–ป๊ฒŒ ์ด ์…ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์•ฑ๋งŒ์ด ์‚ฌ์šฉ์ž์˜ ์ปจํ…์ŠคํŠธ(์ฆ‰, ์ธ์ฆ๋จ/๋น„์ธ์ฆ๋จ) ๋˜๋Š” b) ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”๋‰ด์—์„œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€/๋ณ€๊ฒฝ/์ œ๊ฑฐ/๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์š”๊ตฌํ•œ๋‹ค.

@jassmith ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์–‘์„ ๋งŒ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด ํฌ๋Ÿผ์— ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ฐœ๋ฐœ์ž ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

Btw, ์ด ํ•˜๋‚˜์˜ ์ฃผ์š” ํ•ญ๋ชฉ ์™ธ์— ํ•œ ์•ฑ์˜ ์ฝ”๋“œ์— Shell์„ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ์Šฌํ”„๊ฒŒ๋„ Shell์— ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™/๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋ฅผ ๊บผ๋‚ด์„œ ์ž์ฒด ํ”Œ๋ผ์ด์•„์›ƒ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@dbwelch , ๋ช‡ ๊ฐ€์ง€.
์‚ฌ์–‘์— ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Jason์€ ๋” ์ด์ƒ Forms ์ž‘์—…์„ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ๋ฅผ ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก , ๋ฌธ์ œ ์ œ๊ธฐ

@dbwelch @ChaseFlorell ์—ฌ๊ธฐ์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/xamarin/Xamarin.Forms/issues/5428

@davidortinau ํŽ˜์ด์ง€ ์ œ๋ชฉ, ํ•˜๋‹จ ๋ฐ ์ƒ๋‹จ ํƒญ์— ๊ธ€๊ผด ๋ชจ์Œ์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ๊ธ€๊ผด์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ios ๋ฐ android์šฉ ์‚ฌ์šฉ์ž ์ง€์ • ๋ Œ๋”๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jamiewest ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ œ์ถœํ•˜์„ธ์š”! ๊ฐ์‚ฌ ํ•ด์š”! https://github.com/xamarin/Xamarin.Forms/issues/new?assignees=&labels=t%2Fenhancement+%E2%9E%95&template=feature_request.md&title=%5BEnhancement%5D+YOUR+IDEA%21

UseSwipeGesture ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ด์ œ ShellItem ํด๋ž˜์Šค์—๋Š” ์ž‘๋™ํ•  ShellAppearance ์†์„ฑ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ Android์—์„œ๋Š” TabPage์™€ ๋‹ค๋ฅธ Shell์˜ ํƒญ(TabPage๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šค์™€์ดํ”„ํ•  ์ˆ˜ ์žˆ์Œ)

    <ShellItem.ShellAppearance>
      <MaterialShellAppearance NavBarCollapseStyle="Full" TabBarCollapseStyle="Full" UseSwipeGesture="false">
    </ShellItem.ShellAppearance>

@jingliancui , Cui ํ˜•์ œ๋‹˜, qq๋‚˜ WeChat์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@juepiezhongren ์•ˆ๋…•ํ•˜์„ธ์š”, ์ €์™€ ์ฑ„ํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ์ด qq ๊ทธ๋ฃน์— ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค 313308215

RTM์—์„œ UWP์— ๋Œ€ํ•œ Shell ๋ฐ ์‹œ๊ฐ์  ์ง€์›์ด ์ œ๊ณต๋ฉ๋‹ˆ๊นŒ?

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

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

์—ฌ๋Ÿฌ๋ถ„์ด ๋ฌด์—‡์„ ์ƒ๊ฐํ•ด ๋‚ด๋“  Xamarin.Forms ์•ฑ์„ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์•ฑ์ฒ˜๋Ÿผ ๋ฉ‹์ง€๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ตœ์„ ์„ ๋‹คํ•˜์„ธ์š”! ์ด ๊ธฐ๋Šฅ์€ ํ˜„๋Œ€์ ์ธ XForms ์•ฑ์„ ์œ„ํ•œ ๋” ๋‚˜์€ ๋Ÿฐ์น˜ํŒจ๋“œ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์‚ฌ์–‘์„ ์ถ”์ธกํ•  ํ•„์š” ์—†์ด ์ด ์…ธ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ–„๋ฒ„๊ฑฐ ์•„์ด์ฝ˜์— ์ƒ‰์ƒ์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. C#/Xamarin์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์–ด๋”˜๊ฐ€์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dbwelch ์—ฌ๊ธฐ GitHub์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ํด๋ž˜์Šค๋ฅผ ๋ณด๋ ค๋ฉด "T"๋ฅผ ๋ˆ„๋ฅด๊ณ  Shell์— ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ C#/Xamarin์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์ถœ๋ฐœ์ ์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๋ฌธ์„œ๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ ์ƒ˜ํ”Œ ์ค‘ ์ผ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/davidortinau/Gastropods
https://github.com/davidortinau/ShellGallery
https://github.com/davidortinau/TheLittleThingsPlayground

๋ฌธ์„œ: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell?tabs=android
MSDN ๋ฌธ์„œ: https://msdn.microsoft.com/en-us/magazine/mt848639
๋ธ”๋กœ๊ทธ: https://blog.xamarin.com/xamarin-forms-4-0-preview/

@davidortinau ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฉ๊ธˆ ์ถœ์‹œ๋œ ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. Shell ์ฝ”๋“œ๋Š” ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ? 4.0, Shell ๋“ฑ์˜ ๋ถ„๊ธฐ ์•„๋ž˜๋ฅผ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ์ €์—๊ฒŒ ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค! ๊ฐ์‚ฌ ํ•ด์š”!

@pauldipietro ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ณด์„ธ์š”. @davidortinau ์‹ค์ œ๋กœ ๋ชจ๋“  ๋งํฌ(๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ๋‹ค์šด๋กœ๋“œํ•œ LittleThings ์ œ์™ธ)์— ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์ง€๋งŒ ํ–„๋ฒ„๊ฑฐ ์•„์ด์ฝ˜ ์ƒ‰์ƒ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์•ฑ์—์„œ ๋ณด๋ผ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ (๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š”) ์–ด๋””์—๋„ ์ •์˜๋œ ๋ณด๋ผ์ƒ‰์ด ์—†์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ์‹ค๋ง ;-).

์—…๋ฐ์ดํŠธ: ๋ฐฉ๊ธˆ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  FinishedLaunching์— TintColor๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ์ด์ƒํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋„!

์‹ ์‚ฌ ์—ฌ๋Ÿฌ๋ถ„, ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํ”Œ๋ผ์ด์•„์›ƒ ํŒจ๋„์— ๋ช‡ ๊ฐ€์ง€ ํ•ญ๋ชฉ์ด ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ด๋ฏธ Shell ํ•ญ๋ชฉ(ํ•ญ๋ชฉ ๋‚ด์šฉ ์•„๋‹˜)์„ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ContentPage๊ฐ€ ์žˆ๊ณ  Shell ๋‚ด๋ถ€์— ํƒ์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

<local:DetailPage />

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

๋จธ๋ฆฌ๋ง: ๋‚˜๋Š” newb atm์ž…๋‹ˆ๋‹ค. ๋˜์ง€ ์•Š์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

@davidortinau ๊ทธ๋ž˜์„œ, ์šฐ๋ฆฌ ํšŒ์‚ฌ์˜ ์ฒซ ๋ฒˆ์งธ Xamarin.Forms ํ”„๋กœ์ ํŠธ์— ํƒ์ƒ‰ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ด Shell ๊ธฐ๋Šฅ์„ ๋ฐฐ์šฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์™”์œผ๋ฉฐ(woot!) ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ShellItem์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์œผ๋กœ ๋˜๋Š” ๋” ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜. ์ด๊ฒŒ ๋ณ„ ์ผ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋Œ€์‹  MenuItem ์ปฌ๋ ‰์…˜ ๋‚ด์—์„œ MenuItem์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํ”Œ๋ผ์ด์•„์›ƒ ์ˆ˜์ค€์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด MenuItem์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์‹  MenuItem์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์…ธ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์•ฑ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ? ๋ช…๋ น ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ MenuItem์„ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฅผ ์žƒ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Shell์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋งŽ์€ ShellItem์ด ์œ ์‚ฌํ•œ ์ค‘๊ฐ„ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ OrderType์„ ๋งŒ๋“ค ๊ฒƒ์ด๊ธฐ โ€‹โ€‹๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญ ์‹œ ์„ ํƒํ•œ ShellItem์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ContentTemplate ํŽ˜์ด์ง€ ๋˜๋Š” ์ ์ ˆํ•œ ํ•ญ๋ชฉ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜• ๋ฐ ๋ถ€์„œ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋ณธ ์ฃผ๋ฌธ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ๋จผ์ € OrderDepartment ๋“œ๋กญ๋‹ค์šด ์„ ํƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๊ณณ์ด ์ž˜๋ชป๋œ ๊ณณ์ด๋ผ๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌ ํ•ด์š”!

์—…๋ฐ์ดํŠธ:
์ง€๊ธˆ์€ MenuItems๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ShellViewModel์— ๋ช…๋ น ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋Œ€์ƒ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ContentTemplate ํŽ˜์ด์ง€๋กœ ํ‘ธ์‹œํ•˜๋Š” MenuItem์—์„œ ํƒญ ๊ตฌ์กฐ๋กœ ์ด๋™ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ShellItem์ด ๋ชจ๋‘ ๋งจ ์œ„๋กœ ํŠ€์–ด๋‚˜์˜ค์ง€ ์•Š๋„๋ก ํ”Œ๋ผ์ด์•„์›ƒ ๋‚ด์—์„œ MenuItem์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€ MenuItem์„ ์ปฌ๋ ‰์…˜์˜ ์ผ๋ถ€๋กœ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ShellItem๊ณผ ์„ž์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
MenuItem
ShellItem
ShellItem
MenuItem
ShellItem
MenuItem
...
๋˜๋Š” ShellItems๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์–ด๋Š ์‹œ์ ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” @anthcool ๊ณผ ํ•จ๊ป˜ ์ž„์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ณ  Shell ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ฆญํ•œ ๊ฒƒ์„ ์•Œ๊ธฐ ์œ„ํ•ด ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@anthcool ์€ ํ˜„์žฌ ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๊ธฐ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ํ•˜๊ณ  ๋„์›€์„ ์ฃผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ๋ชฉ๋ก์œผ๋กœ readonly Stack<NavigationParameter> ๊ฐ€ ์žˆ๋Š” ํƒ์ƒ‰ ๋งค๊ฐœ๋ณ€์ˆ˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

public class Navigation
{
    readonly Stack<NavigationParameter> _stack = new Stack<NavigationParameter>();
...
    public Stack<NavigationParameter> Parameters => _stack;
}

NavigationParameter๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public class NavigationParameter : NameValueCollection { }

ํƒ์ƒ‰ํ•  ๋•Œ ํ‘ธ์‹œ ์ „์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

    var p = new NavigationParameter { { nameof(SomePage), SomeObject } };
    Navigation.Parameters.Push(p);

๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ๊ฐ’์„ Peek ๋˜๋Š” Pop ํ•˜๊ณ  ํ‚ค๋ฅผ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์œ„์™€ ๊ฐ™์€ ๊ฒƒ. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@anthcool ์€ ํ˜„์žฌ ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๊ธฐ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ํ•˜๊ณ  ๋„์›€์„ ์ฃผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ๋ชฉ๋ก์œผ๋กœ readonly Stack<NavigationParameter> ๊ฐ€ ์žˆ๋Š” ํƒ์ƒ‰ ๋งค๊ฐœ๋ณ€์ˆ˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

public class Navigation
{
    readonly Stack<NavigationParameter> _stack = new Stack<NavigationParameter>();
...
    public Stack<NavigationParameter> Parameters => _stack;
}

NavigationParameter๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public class NavigationParameter : NameValueCollection { }

ํƒ์ƒ‰ํ•  ๋•Œ ํ‘ธ์‹œ ์ „์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

    var p = new NavigationParameter { { nameof(SomePage), SomeObject } };
    Navigation.Parameters.Push(p);

๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ๊ฐ’์„ Peek ๋˜๋Š” Pop ํ•˜๊ณ  ํ‚ค๋ฅผ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์œ„์™€ ๊ฐ™์€ ๊ฒƒ. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@rizamarhaban ์•„์ด๋””์–ด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๊ธฐ์—์„œ ๊ณง ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Shell๊ณผ Visual์ด UWP๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ๋งค์šฐ ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณผ์—ฐ ์ด ์ŠคํŽ™์ด ์™„์„ฑ๋œ ๊ฒƒ์ผ๊นŒ?
์ด์ œ Tizen ๊ตฌํ˜„์ด ์žˆ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ์ด๊ฒƒ์„ ๋‹ซ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
ํƒ์ƒ‰ ๊ธฐ๋Šฅ์ด ์•„์ง ๊ฒ€ํ†  ์ค‘์ด๋ผ๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

์•„์ง UWP ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ Xamarin์— ๋Œ€ํ•ด ๊ฐ€์ง„ ๊ฐ€์žฅ ํฐ ์‹ค๋ง.

@weitzhandler paul๋กœ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”. ์ด ๋ฌธ์ œ์™€ UWP์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋…ผ์˜ํ•˜๋ ค๋ฉด [email protected]์œผ๋กœ ๋ฌธ์˜ํ•˜์„ธ์š”. ์šฐ๋ฆฌ๋Š” ํ”Œ๋žซํผ์„ ์ ๊ทน์ ์œผ๋กœ ๋ฌด์‹œํ•˜์ง€ ์•Š์ง€๋งŒ Android ๋ฐ iOS๋Š” ์ดˆ๊ธฐ ๊ตฌํ˜„์„ ๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ UWP์— ๋Œ€ํ•œ Shell ์ง€์›์— ๋Œ€ํ•œ ์กฐ์‚ฌ๊ฐ€ ํ™œ๋ฐœํžˆ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

@mrlacey ์•„๋‹ˆ, ๊ฑฐ์˜ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค! ๊ด€๋ จ ๋ฌธ์ œ๋กœ ๊ณ„์† ๋‹ซํž™๋‹ˆ๋‹ค. ๐Ÿ˜„

UWP ์ง€์›์„ ์š”์ฒญํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋‹ค์Œ์„ ์ฐธ์กฐ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€์—์„œ ํƒ์ƒ‰ ๋ชจ์Œ ํ…œํ”Œ๋ฆฟ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
NavigationPage.TitleView๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ด์ „์ฒ˜๋Ÿผ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ ์šฉ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ:
https://github.com/InquisitorJax/Xamarin-Forms-Shell

ํŽธ์ง‘ํ•˜๋‹ค:
Murphy๊ฐ€ ๋‹ค์‹œ ๊ณต๊ฒฉํ•ฉ๋‹ˆ๋‹ค. NavigationPage.TitleView ๋Œ€์‹  Shell.TitleView๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. :)

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,
๋‚ด ์ƒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋‚˜๋Š” Shell๊ณผ CollectionView๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!
์‰˜์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ

  • ๊ณ ์ •๋œ ํ•˜๋‹จ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค(fox ์˜ˆ: ์‚ฌ์šฉ์ž ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ)

๊ณ ์ • ํ—ค๋”(FlyoutHeader ๋ฐ FlyoutHeaderBehavior)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜๋‹จ ๋ฐ”๋‹ฅ๊ธ€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”!

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,
RegisterRoute์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์•ฑ์€ ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ์ƒ๋‹นํžˆ ๋งŽ๊ณ  ์•ฝ โ€‹โ€‹30...
๊ฐ๊ฐ์— ๋Œ€ํ•ด RegisterRoute๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ?
Routing.RegisterRoute("blabla", typeof(BlaBlaPage)); ... ...
์•„๋‹ˆ๋ฉด ๊ธฐ์กด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?
var blaPage = new BlaBlaPage (); await Navigation.PushAsync (blaPage);

@matteopiccioni ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Routing.RegisterRoute("blabla", typeof(BlaBlaPage));

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ
gotoasync("blabla")

์ง€๊ธˆ์€ ๋™์ผํ•˜๊ฒŒ ๋Š๊ปด์ง€์ง€๋งŒ ๊ธฐ๋Šฅ์ด ์ปค์ง์— ๋”ฐ๋ผ Shell ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ด€๋ จ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

๊ฐ๊ฐ์— ๋Œ€ํ•ด RegisterRoute๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ€ ๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ํŽ˜์ด์ง€๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ ์Šค์บ”ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฒ€ํ† ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์š” ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฆฌํ”Œ๋ ‰์…˜์ด ์•ฑ ์†๋„๋ฅผ ๋Šฆ์ถ”๋ฏ€๋กœ ์‹œ์ž‘ ์‹œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@PureWeen ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
๋Š๋ฆฐ ์‹œ์ž‘ ์‹œ๊ฐ„์€ xf(Android์šฉ)์—์„œ ๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
์‹œ์ž‘ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ํŽ˜์ด์ง€(shellitems ํŽ˜์ด์ง€)๋งŒ ๋ผ์šฐํŒ…์— ์ถ”๊ฐ€ํ•˜๊ณ  ์•ฑ์ด ์‹œ์ž‘๋œ ํ›„์—๋งŒ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์ผ์ข…์˜ RegisterRoute ์ง€์—ฐ ๋กœ๋”ฉ)?

@matteopiccioni

๊ทธ๋ž˜์„œ ํ•œ๋ฒˆ์— ์ด๋ ‡๊ฒŒ๋งŒ ํ•˜๋ฉด

Routing.RegisterRoute("blabla", typeof(BlaBlaPage));

๊ดœ์ฐฎ์•„. ๋‚ด๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด ์„ฑ๋Šฅ๊ณผ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Routing.RegisterRoute("blabla", typeof(BlaBlaPage)); ๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•˜๋Š” ์ผ์€ ์‚ฌ์ „์— ๋ฌธ์ž์—ด๊ณผ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

@jassmith @jamesmontemagno @pierceboggan ์™€์šฐ ๋ฉ‹์ง€๋„ค์š” . Google Pixel์—์„œ Pie SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Google ์ฃผ์†Œ๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ๋ชฉ ํ‘œ์‹œ์ค„์ด ์—†๊ณ  ์•ฑ ์ƒ๋‹จ์— ํ†ตํ•ฉ๋œ ํ–„๋ฒ„๊ฑฐ๊ฐ€ ์—†๋Š” UI/UX๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

Google์ด ์—ฐ๋ฝ์ฒ˜, ์ง€๋„ ๋ฐ ๊ธฐํƒ€์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŒจํ„ด์ด๋ฏ€๋กœ ์ด ์ œ์•ˆ์„ Shell์— ๋Œ€ํ•ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ๋ถ„๊ณผ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ท€์ค‘ํ•œ ์‹œ๊ฐ„๊ณผ ๋ฐฐ๋ ค์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค,

์นผ

๋’ค๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ์ƒ˜ํ”Œ์€ ์‚ฌ์–‘์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜๋˜๋Š” ํ…œํ”Œ๋ฆฟํ™”๋œ ShellContent๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ContentTemplate๊ณผ ํ•จ๊ป˜ ShellContents๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜์–ด ์‹œ์ž‘ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ์€ ํ•™์Šต์šฉ์ž…๋‹ˆ๋‹ค.
๋‹คํ–‰ํžˆ ContentTemplates์™€ ํ•จ๊ป˜ ShellContents๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
[...]
์…ธ ์‚ฌ์šฉ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์‹œ์ž‘ํ•  ๋•Œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์ˆ˜์˜ ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ๋Œ€๊ทœ๋ชจ ํ”„๋ŸฐํŠธ๋กœ๋“œ ํ• ๋‹น์œผ๋กœ ์ธํ•ด ์‹œ์ž‘ ์„ฑ๋Šฅ์ด ์ƒ๋‹นํžˆ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๊ฐ€๋Šฅํ•œ ํ•œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ์ฝ˜ํ…์ธ ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๊ณ  ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”๋ฐ ์™œ ์ง์ ‘ ์ฝ˜ํ…์ธ  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? (๋‹จ์ˆœํ•จ๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, ์‚ฌ๋žŒ๋“ค์ด ๋ฐœ์— ์ด์„ ์˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค). ์ผ์ข…์˜ ์ง์ ‘ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด "๋ฐ๋ชจ๋ฅผ ํ•  ๋•Œ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋”์ฐํ•œ" ๊ธฐ๋Šฅ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
๋‚˜ ์—ฌ๊ธฐ ์ฒ˜์Œ์ด์•ผ. ์—ฌ๊ธฐ๊ฐ€ ์งˆ๋ฌธํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ๊ณณ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์งˆ๋ฌธํ•  ๊ณณ์„ ์•Œ๋ ค์ฃผ์„ธ์š”.
์œ„์—์„œ ์ง€์ •ํ•œ ์ƒ˜ํ”Œ๊ณผ ๋น„์Šทํ•œ ์ž‘์—…์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  <ShellItem Title="My music" ItemsSource="{x:Bind MyMusicModels}" TabLocation="Bottom">
    <ShellItem.ItemTemplate>
      <local:MyMusicItemTemplateSelection />
    </ShellItem.ItemTemplate>
  </ShellItem>

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ XLS0413 'ShellItem' ์œ ํ˜•์—์„œ 'ItemsSource' ์†์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ XLS0415 'ShellItem' ์œ ํ˜•์—์„œ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ 'ItemTemplate'์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@Elashi ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—์„œ์ด ์•„์ด๋””์–ด๋ฅผ ์›
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/bindable-layouts

ShellItem์œผ๋กœ?

@PureWeen ์ด ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ 
์ด ์•„์ด๋””์–ด๊ฐ€ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Œ์„ ์•”์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž‘์—…์— ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค!

๋‚ด iPhone์—์„œ ๋ณด๋‚ธ

2019๋…„ 5์›” 5์ผ ์˜ค์ „ 11์‹œ 59๋ถ„์— Elashi < [email protected] [email protected] >์ด(๊ฐ€) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@PureWeen https://nam05.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FPureWeen&data=02%7C01%7C%7C5a4c31a04c6541d6080608d6d172b36a%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636926687892526088&sdata=Y3%2Fxx %2BGt13FFjR5BCwdMg0UouarnTxI0%2FawrXtVEURM%3D&reserved=0 ์ด ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค :) .
์ด ์•„์ด๋””์–ด๊ฐ€ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Œ์„ ์•”์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž‘์—…์— ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub https://nam05.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fxamarin%2FXamarin.Forms%2Fissues%2F2415%23issuecomment-489439176&data์—์„œ ํ™•์ธํ•˜์„ธ์š”. = 02ํผ์„ผํŠธ 7C01 % 7C % 7C5a4c31a04c6541d6080608d6d172b36a % 7C84df9e7fe9f640afb435aaaaaaaaaaaa % 7C1 % 7C0 % 7C636926687892536099 ๋ฐ SDATA = RdPBMt9fPqsPC1x0FlJ1MQzn8BK6m9lfg7nsT09YIN8 % ๋ฐ 3D = 0 ์˜ˆ์•ฝ ๋˜๋Š” ์‹ค์„ ์†Œ๊ฑฐ https://nam05.safelinks.protection.outlook.com/?url=https%3A%2F% 2Fgithub.com % 2Fnotifications % 2Funsubscribe - ์ธ์ฆ์˜ %์˜ 2FAABUHE2I4F33TX2SZJE2RVDPT377JANCNFSM4EZ4GB5Q ๋ฐ ๋ฐ์ดํ„ฐ = 02ํผ์„ผํŠธ 7C01 % 7C % 7C5a4c31a04c6541d6080608d6d172b36a % 7C84df9e7fe9f640afb435aaaaaaaaaaaa % 7C1 % 7C0 % 7C636926687892546103 ๋ฐ SDATA = UXiXgRiTo4pAjJVraUqmJmYZibiWMdh9htX2SeFG4JM % ๋ฐ 3D = 0 ์˜ˆ์•ฝ .

@Elashi ๊ทธ๋ ‡์ง€ ๋Š” ์•Š์ง€๋งŒ MVVM ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์˜ ๊ธฐ๋ณธ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ์‹œํ–‰ ์ฐฉ์˜ค๋ฅผ ํ†ตํ•ด ... ์‰˜ 3.2์™€ TheLittlePlayground์— ์ œ์Šค์ฒ˜์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์ง€๋งŒ ํ‰์ƒ ๋™์•ˆ ์‹œ๊ฐ์  ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ANDROID์—์„œ ์ œ์Šค์ฒ˜๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Shell + ์ œ์Šค์ฒ˜๊ฐ€ iphone์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๋ฉ”๋ชจ์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@davidortinau ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹จ์ง€ ์ผ๋ถ€ ์‚ฌ์–‘

  • ShellContent์˜ ala GPS -> ์Œ์•… -> ์Œ์•… ์•ฑ ์—ด๊ธฐ์— ๋Œ€ํ•œ "ํ•˜์œ„ ๋ฉ”๋‰ด" ํ•ญ๋ชฉ์— ๋Œ€ํ•œ API ์ถ”๊ฐ€

ํ˜„์žฌ GroupHeaders๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— FlyoutMenu๋ฅผ ์žฌ์ž‘์—…ํ•˜์—ฌ 6๊ฐœ์˜ ์ฃผ์š” ๊ทธ๋ฃน์œผ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ ๋‚ด๊ฐ€ ๋ฏธ๋ฆฌ ๊ฒฐ์ •ํ•œ ๊ฒฝ๋กœ๋กœ ๋‚˜๋ฅผ ์•ˆ๋‚ดํ•˜๋Š” FlyoutItems๋กœ ๊ฐ€๋“ ์ฐฌ ํ•˜์œ„ ๋ฉ”๋‰ด๋ฅผ ํ‘œ์‹œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ‘œ์‹œํ•  50๊ฐœ ์ด์ƒ์˜ ์˜ต์…˜์ด ์žˆ๊ณ  ์Šคํฌ๋กค ์ƒํƒœ์— ๋‘๋Š” ๊ฒƒ์ด UI ์นœํ™”์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ์˜ต์…˜์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ…Œ๋งˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ทธ๋ฃน์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด UI/UX ๊ด€์ ์—์„œ ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ/์ƒ์‚ฐ ์ธก๋ฉด์—์„œ ๊ทธ๊ฒƒ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ฐํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? - ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ ๋ฒ ์ด์Šค์˜ ๋ฐฉํ–ฅ์„ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (์ €๋Š” Xamarin์„ ์‚ฌ์šฉํ•œ ์ง€ 1๊ฐœ์›”๋ฐ–์— ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค ์ค‘ ์ผ๋ถ€๋Š” ์•„์ง ์ƒ์†Œํ•ฉ๋‹ˆ๋‹ค).

@TheBaileyBrew

๋ฐฉ๊ธˆ ๊ท€ํ•˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์œผ๋กœ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Shell์€ ์•„๋‹ˆ์ง€๋งŒ MasterDetailPage ์„ค์ •์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/ishrakland/ListViewWithSubListView/

๋˜ํ•œ, ๊ทธ๋“ค์€ ๋งŽ์€ ์ฝ”์Šค ์ž๋ฃŒ๋ฅผ MSFT Learn์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. https://docs.microsoft.com/en-us/learn/browse/?products=xamarin ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค. ํƒ‘์Šน์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ๊ฐค๋Ÿฌ๋ฆฌ ๋˜๋Š” ์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ ํŒŒ์ผ์ด๋‚˜ ์‚ฌ์ง„์„ ์„ ํƒํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
xamarin ์–‘์‹ ๋ˆ„๊ฐ€ ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๊นŒ? ํŒŒ์ผ์€ .PDF ํ™•์žฅ์ž์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. NS
๋‘ ํŒŒ์ผ์„ ๋ชจ๋‘ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ํ•˜๋‚˜์˜ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋„์™€์ฃผ์„ธ์š”!!!

2019๋…„ 5์›” 23์ผ ๋ชฉ์š”์ผ 19:41 Anthony Cool [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@TheBaileyBrew https://github.com/TheBaileyBrew

๋ฐฉ๊ธˆ ๊ท€ํ•˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ•œ ๊ฒƒ์œผ๋กœ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. Shell์€ ์•„๋‹ˆ์ง€๋งŒ MasterDetailPage์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ค์ • ์•„๋งˆ.

https://github.com/ishrakland/ListViewWithSubListView/

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/xamarin/Xamarin.Forms/issues/2415?email_source=notifications&email_token=AK7KSYK4N3XIVP3IHOBE2P3PW3CKJA5CNFSM4EZ4GB52YY3PNVWWK3TUL52HS4DFHEXG43VMXXW
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AK7KSYI5XKMXD7FC7HZH45LPW3CKJANCNFSM4EZ4GB5Q
.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์กฐ๊ฑด์— ๋”ฐ๋ผ ํƒญ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Xaml์ด ์•„๋‹Œ C#์„ ์‚ฌ์šฉํ•˜์—ฌ Shell์— ํƒญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@TheBaileyBrew

์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/flyout#flyout -display-options

@BeleShew ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์€ ์•„๋งˆ๋„ stackoverflow ๋˜๋Š” forum.xamarin.com์—์„œ ๋” ์ ํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@PWaliaDev ์‰˜์˜ ์ผ๋ถ€์ธ ๋‹ค์–‘ํ•œ ํ•ญ๋ชฉ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Shell.Items.Add(์ƒˆ๋กœ์šด ShellItem())
์ƒˆ๋กœ์šด ShellItem().Items.add(์ƒˆ๋กœ์šด ShellSection())
์ƒˆ๋กœ์šด ShellSection().Items.Add(new ShellContent())

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ
https://github.com/xamarin/Xamarin.Forms/issues/5428

๋‹น์‹ ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ• ๊นŒ์š”?

@PureWeen -- ๊ท€ํ•˜์˜ ๋งํฌ์— ๋”ฐ๋ผ ํ‘œ์‹œ ์˜ต์…˜์ด ์„ค์ •๋˜์–ด ์žˆ์ง€๋งŒ ์ œ๊ฐ€ ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ @BeleShew ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž๋ณ„๋กœ ํ”Œ๋ผ์ด์•„์›ƒ ํ•ญ๋ชฉ ์ƒ์„ฑ/์ œ๊ฑฐ).

#5428 ์ˆ˜์ •์€ ๋‚ด๊ฐ€ ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”์— ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๊ฒƒ์œผ๋กœ ๋†€๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋‚ด ๋ฉ”๋‰ด ์˜ต์…˜์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์ด ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ์‹œ๊ฐ„:

foreach (var item in this.Items)
        {
            if (item is FlyoutItem)
            {
                var removeSections = new List<ShellSection>();
                var fi = item as FlyoutItem;
                foreach (var child in fi.Items)
                {
                    if (child.Route == "NOT_AUTHORIZED_KEY")
                        removeSections.Add(child);
                }
                foreach (var s in removeSections)
                    fi.Items.Remove(s);
            }
        }

Shell์€ ์ด๋ก ์ƒ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉด ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž ์—ญํ• ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์…ธ ํ•ญ๋ชฉ ์ถ”๊ฐ€/์ œ๊ฑฐ
  2. ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ๋˜๋Š” ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ํƒ์ƒ‰ ๊ฒฝ๋กœ.
  3. ์„ ํƒ์ ์œผ๋กœ Prism๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ MVVM ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›

๊ธฐ๋Šฅ 1 ๋ฐ 2๊ฐ€ ์ œ๊ณต๋  ๋•Œ๊นŒ์ง€ ๋น„์ฆˆ๋‹ˆ์Šค ์ง€ํ–ฅ ์•ฑ์—์„œ Shell์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@Im-PJ ์™œ 1๋ฒˆ๊ณผ 2๋ฒˆ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์„ธ์š”? (๊ทธ๋“ค์€ ํ™•์‹คํžˆ)

3์ด ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ์—ฌ๊ธฐ ์—์„œ ์ถ”์  ์ค‘์ž…๋‹ˆ๋‹ค.

App Shell ํƒญ์—์„œ ํƒญ ์ด๋ฒคํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๊ด€๋ จ ํฌ๋Ÿผ ์งˆ๋ฌธ: https://forums.xamarin.com/discussion/159748/app-shell-pop-to-root-on-tab-tap

@Im-PJ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Shell๊ณผ ๊ฐ™์€ ๋„๊ตฌ์˜ ์ฃผ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ์Šฌ๋ผ์ด๋“œ ์•„์›ƒ ๋ฉ”๋‰ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

@dotMorten ์•„๋งˆ๋„ ๊ด‘๋ฒ”์œ„ํ•œ C# ๋ฐ ํ•ดํ‚น์„ ํ†ตํ•ด 1 ๋˜๋Š” 2๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„์— ์…ธ ํ•ญ๋ชฉ ๋ฐ”์ธ๋”ฉ/๋น„ํ™œ์„ฑํ™”/์ˆจ๊ธฐ๊ธฐ/์ถ”๊ฐ€์— ๋Œ€ํ•œ

@์ž„ํ”ผ์ œ์ด

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์กฐ๊ธˆ ๋” ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž ์—ญํ• ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์…ธ ํ•ญ๋ชฉ ์ถ”๊ฐ€/์ œ๊ฑฐ
๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ์‹œ๋‚˜๋ฆฌ์˜ค

ํ˜„์žฌ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์žˆ๋Š” ๊ฒฝ์šฐ TabBar๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ”Œ๋ผ์ด์•„์›ƒ ํƒ์ƒ‰์„ ์ˆจ๊ฒจ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<TabBar Route="LoggedOut">
<LoginPage>
</TabBar>

<FlyoutItem Route="LoggedIn"></FlyoutItem>
<FlyoutItem></FlyoutItem>
<FlyoutItem></FlyoutItem>
<FlyoutItem></FlyoutItem>

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋™ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IsVisible ๋ฐ”์ธ๋”ฉ ๊ฐ€๋Šฅ ์†์„ฑ์„ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
https://github.com/xamarin/Xamarin.Forms/tree/shell_isvisible

PR์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์•ฝ๊ฐ„์˜ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ํƒ์ƒ‰ ๊ฒฝ๋กœ.

ํ˜„์žฌ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

hoi1
Xamarin.Form ์…ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งํฌ ์ƒ˜ํ”Œ: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/flyout

๋„์™€์ฃผ์„ธ์š”. ์ •๋ณด ํŽ˜์ด์ง€์— ํƒญ๋ฐ”๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋™์‹œ์— ๋‘ ๊ฐœ์˜ ์‰˜ ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ™ˆ, ์„ค์ •, ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์˜ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ํ”Œ๋ž˜์ด์•„์›ƒ ๋ฉ”๋‰ด์šฉ
์ง‘์—์„œ ํ‘ธ์‹œํ•ด์•ผ ํ•˜๋Š” ํƒญ ํŽ˜์ด์ง€์šฉ
์ง€๊ธˆ์€ '์˜ค๋ž˜๋œ ๋ฐฉ๋ฒ•'์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์‹œ์— ๋‘ ๊ฐœ์˜ ์‰˜ ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ™ˆ, ์„ค์ •, ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์˜ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ํ”Œ๋ž˜์ด์•„์›ƒ ๋ฉ”๋‰ด์šฉ
์ง‘์—์„œ ํ‘ธ์‹œํ•ด์•ผ ํ•˜๋Š” ํƒญ ํŽ˜์ด์ง€์šฉ
์ง€๊ธˆ์€ '์˜ค๋ž˜๋œ ๋ฐฉ๋ฒ•'์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Tabbedpage๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Flyout์„ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” Flyout๊ณผ Tabbar๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผํŽ˜์ด์ง€์— ํƒญ ํ‘œ์‹œ์ค„์ด ํ‘œ์‹œ๋˜๋„๋ก ํ•˜์ง€๋งŒ ํƒญ ํ‘œ์‹œ์ค„์— 4๊ฐœ์˜ ์š”์†Œ๋งŒ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๋” ๋งŽ์€ ํƒญ์„ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Œ). ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

<shell>
<flyoutitem route="animals" flyoutdisplayoptions="AsMultipleItems">
<shellcontent route="cats"/>
<shellcontent route="dogs"/>
<shellcontent route="monkeys"/>
<shellcontent route="elephants"/>
<shellcontent route="bears"/>
<shellcontent route="about"/>
</flyoutitem>
</shell>

๋™์‹œ์— ๋‘ ๊ฐœ์˜ ์‰˜ ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ™ˆ, ์„ค์ •, ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์˜ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ํ”Œ๋ž˜์ด์•„์›ƒ ๋ฉ”๋‰ด์šฉ
์ง‘์—์„œ ํ‘ธ์‹œํ•ด์•ผ ํ•˜๋Š” ํƒญ ํŽ˜์ด์ง€์šฉ
์ง€๊ธˆ์€ '์˜ค๋ž˜๋œ ๋ฐฉ๋ฒ•'์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Tabbedpage๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Flyout์„ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” Flyout๊ณผ Tabbar๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€์— ํƒญ ํ‘œ์‹œ์ค„์ด ํ‘œ์‹œ๋˜๋„๋ก ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์— ๋„ฃ์—ˆ์ง€๋งŒ ํƒญ ํ‘œ์‹œ์ค„์— 4๊ฐœ์˜ ์š”์†Œ๋งŒ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๋” ๋งŽ์€ ํƒญ์„ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Œ). ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

<shell>
<flyoutitem route="animals" flyoutdisplayoptions="AsMultipleItems">
<shellcontent route="cats"/>
<shellcontent route="dogs"/>
<shellcontent route="monkeys"/>
<shellcontent route="elephants"/>
<shellcontent route="bears"/>
<shellcontent route="about"/>
</flyoutitem>
</shell>

๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” Shell์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋™์ผํ•œ ์•ฑ์— ์—ฌ์ „ํžˆ MasterDetailPage์™€ TabbedPage๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(iOS์—์„œ๋Š” Naxam.TopTabbedPage.Forms ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์œ„ ํƒญ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค).
์ด๊ฒƒ์€ ๋‚ด ์˜ค๋ž˜๋œ ํ‹ฐ์ผ“์ด์—ˆ์Šต๋‹ˆ๋‹ค.

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