Maui: [์‚ฌ์–‘] ํƒญ๋ทฐ

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

ํƒญ๋ทฐ

Shell์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒญ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • ์„น์…˜(์˜ˆ: ๊ทธ๋ฆฌ๋“œ) ๋‚ด์— ์ค‘์ฒฉ๋œ ํƒญ์„ ๊ฐ–๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?, _๊ฐ ํƒญ์„ ์™„์ „ํžˆ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?_. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ง€๊ธˆ๊นŒ์ง€๋Š” Custom Renderer๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค...

TabView ๋Š” ํƒญ ์ง‘ํ•ฉ๊ณผ ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. TabView๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

tabview

์ฐธ๊ณ : TabView๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•œ ์œ„์น˜ ์ง€์ •, ์Šคํƒ€์ผ ์ง€์ •, ๋Œ์ถœ๋œ ๋ฒ„ํŠผ๊ณผ ๊ฐ™์€ ๊ท ์ผํ•˜์ง€ ์•Š์€ ์Šคํƒ€์ผ ์ง€์ •๊ณผ ๊ฐ™์€ ๋„ค์ดํ‹ฐ๋ธŒ ํƒญ์ด ํ•œ๊ณ„์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ธ๊ณ„๋ฐ›๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ณด๊ธฐ ์ž…๋‹ˆ๋‹ค.

API

๋‹ค์Œ์œผ๋กœ TabView ์†์„ฑ, ์ด๋ฒคํŠธ ๋ฐ ์‹œ๊ฐ์  ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

์†์„ฑ

TabView ์†์„ฑ

| ์žฌ์‚ฐ | ์œ ํ˜• | ์„ค๋ช… |
|------------|:-------------:|:------------:|
| ํƒญ ํ•ญ๋ชฉ ์†Œ์Šค | IE์ˆซ์ž | TabView์˜ ํƒญ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. |
| ํƒญ๋ทฐ์•„์ดํ…œ๋ฐ์ดํ„ฐํ…œํ”Œ๋ฆฟ | ๋ฐ์ดํ„ฐ ํ…œํ”Œ๋ฆฟ | ํƒญ ๋ณด๊ธฐ๊ฐ€ ํƒญ ํ•ญ๋ชฉ์˜ ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. |
| ํƒญ ์ฝ˜ํ…์ธ  ๋ฐ์ดํ„ฐ ํ…œํ”Œ๋ฆฟ | ๋ฐ์ดํ„ฐ ํ…œํ”Œ๋ฆฟ | ํƒญ ๋ณด๊ธฐ๊ฐ€ ํƒญ ํ•ญ๋ชฉ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. |
| IsCyclical | ๋ถ€์šธ | ์ˆœํ™˜ ํƒญ ํƒ์ƒ‰์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. |
| ์ด์Šฌ๋ ˆ์ด์ง€ | ๋ถ€์šธ | ์ง€์—ฐ ํƒญ ๋กœ๋“œ๋ฅผ โ€‹โ€‹ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. |
| ์„ ํƒ ์ธ๋ฑ์Šค | ์ธํŠธ | ํ˜„์žฌ ์„ ํƒ๋œ ํƒญ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. |
| ํƒญ์ŠคํŠธ๋ฆฝ๋ฐฐ์น˜ | ํƒญ์ŠคํŠธ๋ฆฝ๋ฐฐ์น˜ | TabStrip ๋ฐฐ์น˜(์ƒ๋‹จ ๋˜๋Š” ํ•˜๋‹จ). |
| ํƒญ์ŠคํŠธ๋ฆฝ๋ฐฐ๊ฒฝ | ๋ธŒ๋Ÿฌ์‹œ | TabStrip ๋ฐฐ๊ฒฝ์ž…๋‹ˆ๋‹ค. |
| ํƒญ ํ‘œ์‹œ๊ธฐ ๋ธŒ๋Ÿฌ์‹œ | ๋ธŒ๋Ÿฌ์‹œ | TabIndicator ๋ฐฐ๊ฒฝ. |
| ํƒญ ํ‘œ์‹œ๊ธฐ ๋†’์ด | ๋”๋ธ” | TabIndicator ๋†’์ด์ž…๋‹ˆ๋‹ค. |
| ํƒญ ํ‘œ์‹œ๊ธฐ ๋„ˆ๋น„ | ๋”๋ธ” | TabIndicator ๋„ˆ๋น„์ž…๋‹ˆ๋‹ค. |
| TabIndicator๋ฐฐ์น˜ | TabIndicator๋ฐฐ์น˜ | |
| ํƒญ ํ‘œ์‹œ๊ธฐ ๋ณด๊ธฐ | ๋ณด๊ธฐ | TabIndicator ์ฝ˜ํ…์ธ . |
| ํƒญ ์ฝ˜ํ…์ธ  ๋ฐฐ๊ฒฝ | ๋ธŒ๋Ÿฌ์‹œ | ํƒญ ์ฝ˜ํ…์ธ  ๋ฐฐ๊ฒฝ์ž…๋‹ˆ๋‹ค. |
| ํƒญ ์ฝ˜ํ…์ธ  ๋†’์ด | ๋”๋ธ” | ํƒญ ์ฝ˜ํ…์ธ  ๋†’์ด์ž…๋‹ˆ๋‹ค. |
| ํƒญ์ŠคํŠธ๋ฆฝ ๋†’์ด | ๋”๋ธ” | TabStrip ๋†’์ด์ž…๋‹ˆ๋‹ค. |
| ํƒญ ์ฝ˜ํ…์ธ  ๋†’์ด | ๋”๋ธ” | ํƒญ ์ฝ˜ํ…์ธ  ๋†’์ด์ž…๋‹ˆ๋‹ค. |
| HasTabStripShadow | ๋ถ€์šธ | TabStrip ๊ทธ๋ฆผ์ž ํšจ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์ˆจ๊น๋‹ˆ๋‹ค. |
| IsTabTransitionEnabled | ๋ถ€์šธ | ํƒญ ๊ฐ„ ์ „ํ™˜์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. |
| IsSwipeํ™œ์„ฑํ™” | ๋ถ€์šธ | ์Šค์™€์ดํ”„ ์ œ์Šค์ฒ˜๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. |

TabViewItem ์†์„ฑ

| ์žฌ์‚ฐ | ์œ ํ˜• | ์„ค๋ช… |
|------------|:-------------:|:------------:|
| ํ…์ŠคํŠธ | ๋ฌธ์ž์—ด | ํƒญ์˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. |
| ํ…์ŠคํŠธ ์ƒ‰์ƒ | ์ƒ‰์ƒ | ํƒญ์˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. |
| ํ…์ŠคํŠธ ์ƒ‰์ƒ ์„ ํƒ | ์ƒ‰์ƒ | ์„ ํƒํ•œ ํƒญ์˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. |
| ๊ธ€๊ผด ํฌ๊ธฐ | ๊ธ€๊ผด ํฌ๊ธฐ | ํƒญ ํ…์ŠคํŠธ์— ์‚ฌ์šฉ๋œ ๊ธ€๊ผด ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. |
| ๊ธ€๊ผด ํฌ๊ธฐ ์„ ํƒ | ๊ธ€๊ผด ํฌ๊ธฐ | ์„ ํƒํ•œ ํƒญ์— ์‚ฌ์šฉ๋œ ๊ธ€๊ผด ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. |
| ํฐํŠธํŒจ๋ฐ€๋ฆฌ | ๋ฌธ์ž์—ด | ํƒญ์— ์‚ฌ์šฉ๋œ ๊ธ€๊ผด ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. |
| FontFamily์„ ํƒ | ๋ฌธ์ž์—ด | ์„ ํƒํ•œ ํƒญ์— ์‚ฌ์šฉ๋œ ๊ธ€๊ผด ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. |
| ๊ธ€๊ผด ์†์„ฑ | ๊ธ€๊ผด ์†์„ฑ | ํƒญ์— ์‚ฌ์šฉ๋œ ๊ธ€๊ผด ์†์„ฑ์ž…๋‹ˆ๋‹ค. |
| FontAttributes์„ ํƒ๋จ | ๊ธ€๊ผด ์†์„ฑ | ์„ ํƒํ•œ ํƒญ์— ์‚ฌ์šฉ๋œ ๊ธ€๊ผด ์†์„ฑ์ž…๋‹ˆ๋‹ค. |
| ์•„์ด์ฝ˜ | ์ด๋ฏธ์ง€ ์†Œ์Šค | ํƒญ์˜ ์•„์ด์ฝ˜์ž…๋‹ˆ๋‹ค. |
| ์•„์ด์ฝ˜์„ ํƒ | ์ด๋ฏธ์ง€ ์†Œ์Šค | ์„ ํƒํ•œ ํƒญ์—์„œ ์•„์ด์ฝ˜์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ImageSource์ž…๋‹ˆ๋‹ค. |
| ๋‚ด์šฉ | ๋ณด๊ธฐ | ํƒญ์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. View๋Š” ๋ฌด์—‡์ด๋“  ์ฝ˜ํ…์ธ ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| ๋ฐฐ์ง€ ํ…์ŠคํŠธ | ๋ถ€์šธ | ํƒญ์— ์‚ฌ์šฉ๋œ ๋ฐฐ์ง€ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. |
| ๋ฐฐ์ง€ ํ…์ŠคํŠธ ์ƒ‰์ƒ | ์ƒ‰์ƒ | ํƒญ์— ์‚ฌ์šฉ๋œ ๋ฐฐ์ง€ ํ…์ŠคํŠธ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. |
| ๋ฐฐ์ง€ํ…์ŠคํŠธ์ƒ‰์ƒ์„ ํƒ | ์ƒ‰์ƒ | ์„ ํƒํ•œ ํƒญ์— ์‚ฌ์šฉ๋œ ๋ฐฐ์ง€ ํ…์ŠคํŠธ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. |
| ๋ฐฐ์ง€ ๋ฐฐ๊ฒฝ์ƒ‰ | ์ƒ‰์ƒ | ํƒญ์— ์‚ฌ์šฉ๋œ ๋ฐฐ์ง€ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. |
| ๋ฐฐ์ง€ ๋ฐฐ๊ฒฝ์ƒ‰ ์„ ํƒ | ์ƒ‰์ƒ | ์„ ํƒํ•œ ํƒญ์— ์‚ฌ์šฉ๋œ ๋ฐฐ์ง€ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. |
| ์„ ํƒ๋จ | ๋ถ€์šธ | ํƒญ์ด ์„ ํƒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” bool. |
| ํƒญ์ปค๋งจ๋“œ | ์•„์ด์ปค๋งจ๋“œ | ์‚ฌ์šฉ์ž๊ฐ€ ํƒญ์„ ํƒญํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค. |
| TapCommand๋งค๊ฐœ๋ณ€์ˆ˜ | ๊ฐœ์ฒด | ํƒญ ๋ช…๋ น ๋งค๊ฐœ๋ณ€์ˆ˜. |

์ด๋ฒคํŠธ

TabView ์ด๋ฒคํŠธ

| ์ด๋ฒคํŠธ | ์„ค๋ช… |
|------------|:-------------:|
| ์„ ํƒ ๋ณ€๊ฒฝ๋จ | ์„ ํƒํ•œ ํƒญ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. |
| ์Šคํฌ๋กค | ํƒญ ์‚ฌ์ด๋ฅผ ์Šค์™€์ดํ”„ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. |

TabViewItem ์ด๋ฒคํŠธ

| ์ด๋ฒคํŠธ | ์„ค๋ช… |
|------------|:-------------:|
| ํƒญํƒญ | ์‚ฌ์šฉ์ž๊ฐ€ ํƒญ์„ ํƒญํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. |

๋น„์ฃผ์–ผ ์ƒํƒœ

VSM(Visual State Manager)์€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
VSM์€ ์‹œ๊ฐ์  ์ƒํƒœ์˜ ๊ฐœ๋…์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. TabView๋Š” ๊ธฐ๋ณธ ์ƒํƒœ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‹œ๊ฐ์  ๋ชจ์–‘์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TabView์—๋Š” ๋„ค ๊ฐ€์ง€ ํŠน์ • VisualState๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค .

  • CurrentTabVisualState
  • NextTabVisualState
  • PreviousTabVisualState
  • DefaultTabVisualState

์‹œ๋‚˜๋ฆฌ์˜ค

์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒ˜ํ”Œ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํƒญ

๊ธฐ๋ณธ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<TabView 
    TabStripPlacement="Bottom"
    TabStripBackgroundColor="Blue">
    <TabViewItem
        Icon="triangle.png"
        Text="Tab 1">
        <Grid 
            BackgroundColor="Gray">
            <Label
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Text="TabContent1" />
        </Grid>
    </TabViewItem>
    <TabViewItem
        Icon="circle.png"
        Text="Tab 2">
        <Grid>
            <Label    
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Text="TabContent2" />
        </Grid>
    </TabViewItem>
</TabView>

basic-tabs

ํƒญ ํ•ญ๋ชฉ ์†Œ์Šค

TabItemsSource(๋™์  ํƒญ) ์‚ฌ์šฉ:

<TabView
    TabItemsSource="{Binding Monkeys}"
    TabViewItemDataTemplate="{StaticResource TabViewItemTemplate}"
    TabContentDataTemplate="{StaticResource TabContentTemplate}" />

tabitemssource

์‚ฌ์šฉ์ž ์ •์˜ ํƒญ

๊ฐ ํƒญ์˜ ๋ชจ์–‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<ControlTemplate
    x:Key="TabItemTemplate">
    <Grid>
    ...
    </Grid>
</ControlTemplate>

<TabView>
    <TabViewItem
        Text="Tab 1"
        ControlTemplate="{StaticResource TabItemTemplate}">
    </TabViewItem>
</TabView>

custom-tabs

์ˆœํ™˜ ํƒญ

ํƒญ ์‚ฌ์ด๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

<TabView
    IsCyclical="True">
    ...
</TabView>

iscyclical

์ง€์—ฐ ๋กœ๋”ฉ

์ง€์—ฐ ํƒญ ๋กœ๋”ฉ:

<TabView
    IsLazy="True">
    ...
</TabView>

lazy-tabs

ํƒญ ์ „ํ™˜ ๋ฐ TabViewItem ์• ๋‹ˆ๋ฉ”์ด์…˜

Xamarin.Forms ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํƒญ ๊ฐ„์˜ ์ „ํ™˜์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๊ณ , ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์งˆ ๋•Œ ํƒญ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜, ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์งˆ ๋•Œ ๋ฐฐ์ง€์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

<TabView>
    <TabView.TabTransition>
        <local:CustomTabTransition />
    </TabView.TabTransition>
    <TabViewItem
        Text="Tab 1">      
            <TabViewItem.TabAnimation>
                <local:CustomTabViewItemAnimation />
            </TabViewItem.TabAnimation>
        <Grid 
            BackgroundColor="LawnGreen">
            <Label
                HorizontalOptions="Center"
                VerticalOptions="Center"
                Text="TabContent1" />
        </Grid>
    </TabViewItem>
    ...
</TabView>

custom-tabs-animation

VisualStates ์‚ฌ์šฉ

๋‹ค๋ฅธ ์‹œ๊ฐ์  ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ํƒญ, ๋‹ค์Œ ํƒญ ๋“ฑ์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<Grid>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="TabViewStates">
            <VisualState x:Name="CurrentTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="1" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="PreviousTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="0.7" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="NextTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="0.7" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="DefaultTab">
                <VisualState.Setters>
                    <Setter Property="Opacity" Value="0.9" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Label Text="{Binding Index}" HorizontalOptions="Center" VerticalOptions="End" />
</Grid>

C๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒญ ๋งŒ๋“ค๊ธฐ

XAML ๋˜๋Š” C#์„ ์‚ฌ์šฉํ•˜์—ฌ Xamarin.Forms์—์„œ UI๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C#์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒญ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

var tabView = new Tabs
{
    TabStripPlacement = TabStripPlacement.Bottom,
    TabStripBackgroundColor = Color.Blue,
    TabStripHeight = 60,
    TabIndicatorColor = Color.Yellow,
    TabContentBackgroundColor = Color.Yellow
};

var tabViewItem1 = new TabViewItem
{
    Icon = "triangle.png",
    Text = "Tab 1",
    TextColor = Color.White,
    TextColorSelected = Color.Yellow,
};

var tabViewItem1Content = new Grid
{
    BackgroundColor = Color.Gray
};

var label1 = new Label
{
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center,
    Text = "TabContent1"
};

tabViewItem1Content.Children.Add(label1);

tabViewItem1.Content = tabViewItem1Content;

tabView.TabItems.Add(tabViewItem1);

var tabViewItem2 = new TabViewItem
{
    Icon = "circle.png",
    Text = "Tab 2",
    TextColor = Color.White,
    TextColorSelected = Color.Yellow
};

var tabViewItem2Content = new Grid
{
    BackgroundColor = Color.OrangeRed
};

var label2 = new Label
{
    HorizontalOptions = LayoutOptions.Center,
    VerticalOptions = LayoutOptions.Center,
    Text = "TabContent2"
};

tabViewItem2Content.Children.Add(label2);

tabViewItem2.Content = tabViewItem2Content;

tabView.TabItems.Add(tabViewItem2);

์Šคํƒ€์ผ ์‚ฌ์šฉ

XAML ์Šคํƒ€์ผ ๋˜๋Š” CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒญ ์ฝ˜ํ…์ธ , ํƒญ ์ŠคํŠธ๋ฆฝ, ํƒญ ํ•ญ๋ชฉ ๋“ฑ์˜ ๋ชจ์–‘์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

XAML ์‚ฌ์šฉ:

<Style
    x:Key="TabItemStyle"
    TargetType="TabViewItem">
    <Setter
        Property="FontSize"
        Value="12" />
    <Setter
        Property="TextColor"
        Value="#979797" />
</Style>

CSS ์‚ฌ์šฉ:

.customTabItem {
    font-size: medium;
    text-color: red;
}

๋‚œ์ด๋„ : ์ค‘

์ถ”๊ฐ€ ์ •๋ณด

https://github.com/xamarin/Xamarin.Forms/issues/10773 ๊ธฐ๋ฐ˜

proposal-open

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

@irongut , ๋ฉ”๋ชจ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ์ž˜๋ชป๋œ ๋””์ž์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. BadgeText์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด String ๋˜๋Š” ImageSource์™€ ๊ฐ™์€ ์œ ํ˜•์œผ๋กœ ๊ฐœ๋ฐœ์ž๋ฅผ ์ œํ•œํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ณง ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์ง€ ๋ชจ์„œ๋ฆฌ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ๋งŒ๋“ค๊ธฐ, ๋ฐฐ์ง€๋ฅผ ํฌ๊ฒŒ, ์ž‘๊ฒŒ, ๊ทธ๋ฆผ์ž, ์•„์ด์ฝ˜ ์™ผ์ชฝ, ์œ„, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ, ์•„์ด์ฝ˜ ์•ž, ์•„์ด์ฝ˜ ๋’ค, ์• ๋‹ˆ๋ฉ”์ด์…˜ ... ๋“ฑ๋“ฑ. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ขŒ์ ˆ๊ฐ์„ ๋Š๋‚„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ์“ฐ๋ฉด์„œ ์ €๋Š” ํ˜„์žฌ X์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ๋‘ ๋ฒˆ ํšŒ์ „ํ•˜๋Š” ์•Œ๋ฆผ ๋ฐฐ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์–ผ๋งˆ๋‚˜ ์ด์ƒํ•œ์ง€ ๋ณผ๊นŒ์š”?

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

MVU์—์„œ C# ์ƒ˜ํ”Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

TabView ๋™์ž‘์ด ํ™•์žฅ๋˜์–ด ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋„“์œผ๋ฉด ํƒญ์ด 'ํฌ์žฅ ํ•ด์ œ'๋˜์–ด ๋ชจ๋“  ํƒญ์˜ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋˜๋„๋ก ์ผ๋ถ€ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค(์˜ˆ: ๊ด‘์‚ฐ)์— ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™”๋ฉด์„ ๊ฐ€๋กœ์งˆ๋Ÿฌ. ์ด๊ฒƒ์€ ํƒœ๋ธ”๋ฆฟ๊ณผ ์ •๋ง ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ๊น”๋”ํ•œ '๋ฐ˜์‘ํ˜• ๋””์ž์ธ'์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

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

์•„์ด์ฝ˜์€ ImageSource ๋Œ€์‹  View ์œ ํ˜•์ด ๋˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ ํƒญ ์•„์ด์ฝ˜์˜ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ์— ์ž‘์€ ์ ์œผ๋กœ ํ‘œ์‹œ).

์•„์ด์ฝ˜์€ ImageSource ๋Œ€์‹  View ์œ ํ˜•์ด ๋˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ ํƒญ ์•„์ด์ฝ˜์˜ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ์— ์ž‘์€ ์ ์œผ๋กœ ํ‘œ์‹œ).

@MhAllan ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด TabViewItem ์†์„ฑ BadgeText, BadgeTextColor, BadgeTextColorSelected, BadgeBackgroundColor & BadgeBackgroundColorSelected๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ฌ์„ฑ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

BadgeText์— ์ž˜๋ชป๋œ ์œ ํ˜•์ด ๋‚˜์—ด๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Bool์ด ์•„๋‹ˆ๋ผ String์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@irongut , ๋ฉ”๋ชจ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ์ž˜๋ชป๋œ ๋””์ž์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. BadgeText์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด String ๋˜๋Š” ImageSource์™€ ๊ฐ™์€ ์œ ํ˜•์œผ๋กœ ๊ฐœ๋ฐœ์ž๋ฅผ ์ œํ•œํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ณง ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์ง€ ๋ชจ์„œ๋ฆฌ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ๋งŒ๋“ค๊ธฐ, ๋ฐฐ์ง€๋ฅผ ํฌ๊ฒŒ, ์ž‘๊ฒŒ, ๊ทธ๋ฆผ์ž, ์•„์ด์ฝ˜ ์™ผ์ชฝ, ์œ„, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ, ์•„์ด์ฝ˜ ์•ž, ์•„์ด์ฝ˜ ๋’ค, ์• ๋‹ˆ๋ฉ”์ด์…˜ ... ๋“ฑ๋“ฑ. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ขŒ์ ˆ๊ฐ์„ ๋Š๋‚„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ์“ฐ๋ฉด์„œ ์ €๋Š” ํ˜„์žฌ X์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ๋‘ ๋ฒˆ ํšŒ์ „ํ•˜๋Š” ์•Œ๋ฆผ ๋ฐฐ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์–ผ๋งˆ๋‚˜ ์ด์ƒํ•œ์ง€ ๋ณผ๊นŒ์š”?

@MhAllan Syncfusion์˜ SfTabview๋Š” ๋ณด๋‹ค ๋™์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” Syncfusion์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒํ–ˆ๋Š”์ง€๋ณด๊ณ  ์˜๊ฐ์„์ฃผ๋Š” ์ข‹์€ ์˜ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— 100๋งŒ ์ด์ƒ์˜ ๋Œ€๊ธฐ์—…์— ๋Œ€ํ•ด์„œ๋งŒ ์ง€๋ถˆํ•œ ๊ฐœ์ธ ๊ณ ๊ฐ์—๊ฒŒ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ Xamarin ์ž์ฒด๋ณด๋‹ค 1-2 ๋‹จ๊ณ„ ์•ž์„œ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋‹ฌ, ๋ช‡ ๋…„ ๋™์•ˆ ์ ์ ˆํ•œ Collection/ListView๋ฅผ ์–ป์„ ์ˆ˜์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

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

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

์•ˆ์ •์ ์ธ ์šด์˜์„ ์œ„ํ•ด์„œ๋Š” ์–ด๋Š์ •๋„์˜ ์ œ์•ฝ์ด ์žˆ๋Š”๊ฑด ์ข‹์€๊ฑฐ ๊ฐ™์•„์š”

์•ˆ์ •์ ์ธ ์šด์˜์„ ์œ„ํ•ด์„œ๋Š” ์–ด๋Š์ •๋„์˜ ์ œ์•ฝ์ด ์žˆ๋Š”๊ฑด ์ข‹์€๊ฑฐ ๊ฐ™์•„์š”

์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด "์•ˆ์ •์ ์ธ ์ž‘์—…"์„ ์œ„ํ•ด ๊ธฐ๋ณธ ํƒญ ๋ณด๊ธฐ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ณด๊ธฐ๋ฅผ ์ œํ•œํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” Xamarin Community Toolkit์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

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

4creators picture 4creators  ยท  31์ฝ”๋ฉ˜ํŠธ

handicraftsman picture handicraftsman  ยท  4์ฝ”๋ฉ˜ํŠธ

qcjxberin picture qcjxberin  ยท  5์ฝ”๋ฉ˜ํŠธ

mhrastegary77 picture mhrastegary77  ยท  3์ฝ”๋ฉ˜ํŠธ