์ด๊ฒ์ ์๋ก์ด ๊ธฐ๋ฅ ๋๋ API ์ ์์ ์ํ ํ ํ๋ฆฟ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ์ ํ์ ๋ํ ์ API๋ฅผ ์ ์ํ๊ฑฐ๋ ์ UI ์ปจํธ๋กค์ ๋ํ ์์ด๋์ด๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ด ์์ด๋ ๊ด์ฐฎ์ต๋๋ค. ์์ฝ ๋ฐ ๊ทผ๊ฑฐ๋ถํฐ ์์ํ ์ ์์ต๋๋ค. ์ด ๋งํฌ๋ WinUI ๊ธฐ๋ฅ/API ์ ์ ํ๋ก์ธ์ค๋ฅผ ์ค๋ช ํฉ๋๋ค. https://github.com/Microsoft/microsoft-ui-xaml-specs/blob/master/docs/feature_proposal_process.md ๊ธฐ๋ฅ ๋๋ API ์ ์์ ๋ํ ์ ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ์งง๊ณ ๊ตฌ์ฒด์ ์ผ๋ก ๊ธฐ์ ํด ์ฃผ์ญ์์ค.
tl:dr; Win10์ ํ์ ๋ฆด๋ฆฌ์ค๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ ํ ํ์ฉํ ์ ์๋ ์ ์ฐํ๋ฉด์๋ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์คํฌ๋กค ๋ฐ ํ๋/์ถ์ ์ปจํธ๋กค์ XAML์์ ์ ๊ณตํฉ๋๋ค.
ScrollViewer ์ปจํธ๋กค์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ปจํธ๋กค(ํ๋ซํผ ๋ฐ ๋นํ๋ซํผ ๋ชจ๋)์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์คํฌ๋กค ๋ฐฉ์ ๋๋ฌธ์ ๋ชจ๋ UI์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ปจํธ๋กค์ ๊ธฐ๋ณธ ์ ์ฑ ๋ฐ UX(์: ์์ ์คํฌ๋กค ๋ง๋, ํฌ์ปค์ค/ํค๋ณด๋ ์ํธ ์์ฉ, ์ ๊ทผ์ฑ, ๊ธฐ๋ณธ ์คํฌ๋กค ์ ๋๋ฉ์ด์ ๋ฑ)์ ํจ๊ป ์ด๋ ๋ฐ ํ๋/์ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ํ ์ผ์์ ์ธ ์ฑ ์๋๋ฆฌ์ค๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์์ ์คํฌ๋กค ๊ธฐ๋ฐ ์ปจํธ๋กค์ ํต์ฌ ๊ตฌ์ฑ ์์๊ฐ ๋๊ณ ๋งค์ฐ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๋น์คํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์ ์ฐํด์ผ ํฉ๋๋ค. ํ์ฌ ์ ์ด๋ ์ด๋ฌํ ์์ค์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
ํต์ฌ ํ๋ซํผ์ ๊ณต๊ฐ API ์์ ๊ณ์ธตํ๋ ๋ฐฉ์์ผ๋ก ScrollViewer ์ปจํธ๋กค์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ค์ํ ๋๋ค๋์ ๋๋ค.
๊ธฐ์กด ์ปจํธ๋กค์ 1) UWP ๋ด์์ ์ง์ ์ฌ์ฉํ ์ ์๊ณ , 2) ๊ฐ๋ฐ์๊ฐ ๊ณ ์ ํ ์คํฌ๋กค ๊ฒฝํ์ ์์ฑํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ ์ฌ์ฉ์ ์ง์ ์์ค์ ํ์ฉํ์ง ์์ผ๋ฉฐ, 3) ๋์ฒด๋๋ DirectManipulation API ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Win8์์ ์์ฑ๋์์ต๋๋ค. UWP์ ์ต์ InteractionTracker API๋ก
๊ธฐ์กด ScrollViewer ์ปจํธ๋กค์ ์๋ ๊ทธ๋๋ก ์ถ์ถํ๋ ๊ฒ์ ์์์ด ์๋๋๋ค. ๋์ ์ปจํธ๋กค์ InteractionTracker ์ ์ต์ (๋ฐ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ) ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฑฐ์ ๋์ผํ API ํ๋ฉด์ ์ฌ์ฉํ์ฌ ๋ค์ ๊ตฌํํด์ผ ํฉ๋๋ค.
_Windows_.UI.Xaml.Controls ๋ค์์คํ์ด์ค์ ๊ธฐ์กด ScrollViewer๋ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋ฉ๋๋ค(์ค์ํ ๋ฒ๊ทธ ์์ ์ ์ธ).
์ ScrollViewer๋ _Microsoft_.UI.Xaml.Controls ๋ค์์คํ์ด์ค์ ์์ต๋๋ค. API๋ ๋๋ถ๋ถ _Windows_ ๋ฒ์ ๊ณผ ๋์ผํฉ๋๋ค. ๋ถ๋ช ํ ์ด์ ์ด ์๋ ๊ฒฝ์ฐ(๊ณตํต ์๋๋ฆฌ์ค ๋จ์ํ, ์๋ก์ด ๊ธฐ๋ฅ ๋์ ๋ฑ) ์ปจํธ๋กค์ API๋ฅผ ๋์์ผ๋ก ์กฐ์ ํฉ๋๋ค.
์๋ก์ด ScrollViewer์ ํจ๊ป Microsoft.UI.Xaml.Controls._Primitives_ ๋ค์์คํ์ด์ค์ ์๋ ์๋ก์ด ์ ํ์ธ Scroller๋ฅผ ์๊ฐํฉ๋๋ค. Scroller๋ InteractionTracker ์ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก XAML์์ ์คํฌ๋กค ๋ฐ ํ๋/์ถ์๋ฅผ ์ํ ํต์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ ์ปจํธ๋กค์ ์ด๊ธฐ ๋ชฉํ๋ ๋ค์ ๊ณต์ ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ๋ก ํ์ง์ ์ ๊ณตํ๊ธฐ ์ํ ํต์ฌ ๊ธฐ๋ฅ์ ์ป๋ ๊ฒ์ ๋๋ค. ์๋ฃ๋์ง ์์ API๋ '๋ฏธ๋ฆฌ๋ณด๊ธฐ'๋ก ์ ์ง๋๋ฉฐ ์ํํ โโํจํค์ง์ ์ผ๋ถ๋ก๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
-------------------- ์๋ ์น์ ์ ์์ด๋์ด๋ ์ ์์๋ฅผ ์ ์ถํ ๋ ์ ํ ์ฌํญ์ ๋๋ค. PR์ ๋ง์คํฐํ๊ธฐ ์ ์ ๋ชจ๋ ์น์ ์ด ํ์ํ์ง๋ง ํ ๋ก ์ ์์ํ๋ ๋ฐ๋ ํ์ํ์ง ์์ต๋๋ค. ----------------------
| # | ๊ธฐ๋ฅ | | ์ฐ์ ์์ |
|:-:|:--|-|:-:|
| 1 | ๊ธฐ์กด ScrollViewer์ ์ผ์นํ๋ ๊ธฐ๋ณธ UX๋ก _๋น๋ฐ๋ด_, ์ด๋ ๋ฐ ํ๋/์ถ์ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. || ํ์ |
| 2 | ๊ณต๊ฐ๋ ํ๋ซํผ ์ง์ API์๋ง ์์กดํ์ฌ ํ๋ซํผ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ค๋๋ค. || ํ์ |
| 3 | ํ๋ ์์ํฌ ์์ค XAML ์๋น์ค์ ํตํฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด:
- ์์คํ
ํฌ์ปค์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋งํฉ๋๋ค.
- ์ด์ ์ด ๋ง์ถฐ์ง ์์๋ฅผ ์๋์ผ๋ก ๋ณด๊ธฐ(ํค๋ณด๋, ๊ฒ์ํจ๋, ์คํฌ๋ฆฐ ๋ฆฌ๋)
- ํจ๊ณผ์ ์ธ ๋ทฐํฌํธ ๋ณ๊ฒฝ์ ์ฐธ์ฌ
- ์คํฌ๋กค ๊ณ ์ ์ง์ || ํ์|
| 4 | ์
๋ ฅ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์
์ ์ํํ ์ ์์ || ํ์ |
| 5 | ์ด๋ฏธ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ ๊ธฐ์กด ์คํฌ๋กค ์ข
์ ์ปจํธ๋กค(์: ParallaxView, RefreshContainer, SwipeControl)๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. || ํ์ |
| 6 | ๊ด์ฑ ๋ณด๊ธฐ ๋ณ๊ฒฝ(์: ์ฌ์ฉ์ ์ง์ ์ ๋๋ฉ์ด์
์คํฌ๋กค ๋๋ ํ๋/์ถ์)์ ๋ํ ๊ณก์ ์ ์ ์ดํ ์ ์์ต๋๋ค. || ํ์ |
| 7 | ์ ๋ ๋๋ ์๋ ์คํ์
์ ๊ธฐ๋ฐ์ผ๋ก ๋ณด๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค(์: ๊ด์ฌ ์ง์ ์ผ๋ก ์คํฌ๋กค) || ํ์ |
| 8 | ์ํ์ค/์ถ๊ฐ ์๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณด๊ธฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ(์: ๋๋๊ทธ ์ค ๋๋กญ ๋๋ ๋ง์ฐ์ค ์ ํ ์ง์ฌ๊ฐํ์ ํตํ ๋ค์ค ์ ํ ์ค ์๋ ๋ถ๋๋ฌ์ด ์คํฌ๋กค) || ํ์ |
| 9 | ์ค๋ฒํฌ๊ณผ ๊ทธ ์ ๋๋ฅผ ๊ฐ์งํ ์ ์์ || ํ์ |
| 10 | ์คํฌ๋กค ์ํ์ ๋ณํ๋ฅผ ๊ด์ฐฐํ๊ณ ๋์ํ ์ ์์ || ํ์ |
| 11 | ์ค๋
ํฌ์ธํธ ์คํฌ๋กค ๋ฐ ํ๋/์ถ์ ์ง์. || ํด์ผ |
| 12 | ์ฌ์ฉ์ ์ง์ "์คํฌ๋กค ๋ง๋" ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ ์คํฌ๋กค์ ๊ตฌ๋ํ ์ ์์ต๋๋ค(์: ์ฌ์ง ํ์๋ผ์ธ ์คํฌ๋ฌ๋ฒ). || ํด์ผ |
| 13 | ํน์ ์
๋ ฅ ์ ํ์ ๋ฌด์ํ๋๋ก ์ปจํธ๋กค์ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค(์: ํฐ์น ๋๋ ํ์ ์๋ตํ์ง๋ง ๋ง์ฐ์ค ํ ์
๋ ฅ์ ๋ฌด์). || ํด์ผ |
| 14 | ์คํฌ๋กค ์์น๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ ์ ์์ต๋๋ค(์: ๊ฐ์ํ ๋ชฉ๋ก์์) || ํด์ผ |
| 15 | ๊ณ ์ ํค๋/์์๋ฅผ ์ง์ํฉ๋๋ค. || ํด์ผ |
| 16 | ์ฌ์ฉ์๊ฐ ๋น ๋ฅด๊ฒ ์ฐ์์ ์ผ๋ก ๋ฐ๋ณต๋๋ ์ ์ค์ฒ๋ฅผ ํ ๋ ๊ฐ์ ์คํฌ๋กค์ ์ง์ํฉ๋๋ค . || ํด์ผ |
| 17 | ๋ง์ฐ์ค ๊ฐ์ด๋ฐ ํด๋ฆญ ๋ฐ ์คํฌ๋กค ์ ์ง์ํ๋ ๊ธฐ๋ณธ UX๋ฅผ ์ ๊ณตํฉ๋๋ค. | | ํด์ผ |
| 18 | ๋ง์ฐ์ค๋ฅผ ํตํด ํด๋ฆญ ๋ฐ ์ด๋ํ๋ ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค(์: PDF ๋ทฐ์ด ๋ด์์ ์ฝํ
์ธ ์ด๋). | | ํด์ผ |
| 19 | ์ฌ์ฉ์ ์ ์ ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ ํ๋/์ถ์๋ฅผ ๊ตฌ๋ํ ์ ์์ต๋๋ค(์: ํ๋/์ถ์ ์ฌ๋ผ์ด๋). || ํด์ผ |
| 20 | ์คํฌ๋กค ๊ฐ๋ฅ ์์ญ์ ํฌํจ๋ ์ฝํ
์ธ ๋ฅผ ์ธ์ํ ์ ์์ต๋๋ค. || ํด์ผ |
| 21 | ํ์ ์ ์ค์ฒ๋ฅผ ์ง์ํฉ๋๋ค. || ์ |
| 22 | ๊น๋ฐ์ ๋ฐ ๋ฒ๋ฒ
๊ฑฐ๋ฆผ ์๋ ์คํฌ๋กค๋ก ๋ ์ด์์ ์์ญ์ ๋๊ธฐํํ ์ ์์ต๋๋ค(์: ํ
์คํธ ์ฐจ์ด ์๋๋ฆฌ์ค). || ์ |
| 23 | ์
๋ ฅ ๊ธฐ๋ฐ ๋ณด๊ธฐ ๋ณ๊ฒฝ์ ๋ํ ์ ๋๋ฉ์ด์
๊ณก์ ์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค(์: ์ค๋ ฅ ์ฐ๋ฌผ๊ณผ ๊ฐ์ ์๊ฐ๋ฝ ์๋๋ก ๋์ ์ ์). || ์ |
| 24 | ์๋ก ์คํฌ๋กค ๋๋ ์๋๋ก ์คํฌ๋กค์ ์ง์ํฉ๋๋ค . || ์ |
| 25 | ์ค๋ฒํจ๋์ ๋นํ์ฑํํ ์ ์์ต๋๋ค. || ์ |
| 26 | UIElement์ ManipulationMode ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ScrollViewer ๋ด์์ ์ฝํ
์ธ ๋ฅผ ์ ํ์ ์ผ๋ก ์กฐ์ํ ์ ์์ต๋๋ค . || ์ |
| 27 | ๊ด์ฑ ๋ฐ/๋๋ ๊ด์ฑ์์ ํ๋ ๊ธฐ๋ฅ์ ๋ ์ ์์ต๋๋ค. || ์|
| 28 | ์ฝํ
์ธ ์๋ฅด๊ธฐ๋ฅผ ๋นํ์ฑํํ ์ ์์ต๋๋ค(์: CanContentRenderOutsideBounds ). || ์ |
| 29 | ๋ทฐ ๋ณ๊ฒฝ์ ๋์์ ์๋ฃ ์ด์ ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. || ์ |
๊ธฐ๋ณธ์ ์ผ๋ก ScrollViewer๋ ์ฝํ ์ธ ์ ํฌ๊ธฐ๊ฐ ๋ทฐํฌํธ๋ณด๋ค ํด ๋ ์ฝํ ์ธ ์ ๋ํ ํจ๋์ ์ง์ํฉ๋๋ค. ์ฝํ ์ธ ์ ํฌ๊ธฐ๋ XAML์ ๋ ์ด์์ ์์คํ ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์๋ ์์ ๋ ํ์ฌ ScrollViewer์ ์ ScrollViewer ๊ฐ์ ์ฃผ์ API ์ฐจ์ด์ ์ ๊ฐ์กฐํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
์ฝํ ์ธ ์ ๋๋น๋ ๋ทฐํฌํธ์ ๋์ผํ๋๋ก ์๋์ผ๋ก ์ ํ๋ฉ๋๋ค. ๋์ด๋ ์ ํ์ด ์์ต๋๋ค. ๋ทฐํฌํธ์ ๋์ด๋ฅผ ์ด๊ณผํ๋ฉด ์ฌ์ฉ์๋ ๋ค์ํ ์ ๋ ฅ ๋ฐฉ์์ ํตํด ํฌํ ์ ์์ต๋๋ค.
<ScrollViewer Width="500" Height="400">
<ItemsRepeater ItemsSource="{x:Bind ViewModel.Items}" ItemTemplate="{StaticResource MyTemplate}"/>
</ScrollViewer>
์ด๋ ์ด์ ์ HorizontalScrollBarVisibility๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ธฐ์กด ScrollViewer์์ ์๋์ ์ผ๋ก ๋ฒ์ด๋ฌ์ต๋๋ค. ๋ง์ ๊ฐ๋ฐ์๋ค์ ํผ๋์ค๋ฝ๊ฒ ํ์ต๋๋ค.
<ScrollViewer Width="500" Height="400" ContentOrientation="Horizontal">
<StackPanel Orientation="Horizontal">
<!-- ... -->
</StackPanel>
</ScrollViewer>
_ContentOrientation_ ์์ฑ์ ์ค์ ํ๋ฉด ๊ฐ๋ก ์ ์ฉ ์คํฌ๋กค์ด ํ์ฑํ๋ฉ๋๋ค. ๋ ์ด์์ ์ค์ ์ฝํ ์ธ ์ ์ฌ์ฉ๋๋ ์ ์ฝ ์กฐ๊ฑด์ ๊ฒฐ์ ํฉ๋๋ค. Horizontal ๊ฐ์ ์ฝํ ์ธ ๊ฐ ์ํ์ผ๋ก ์ ํ๋์ง ์๊ณ (๋ฌดํํ ํฌ๊ธฐ ํ์ฉ) ๋ทฐํฌํธ์ ์ผ์นํ๋๋ก ์์ง์ผ๋ก ์ ํ๋จ์ ์๋ฏธํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์ง(๊ธฐ๋ณธ๊ฐ)์ ์์ง์ผ๋ก ๊ตฌ์๋์ง ์๊ณ ์ํ์ผ๋ก ๊ตฌ์๋จ์ ์๋ฏธํฉ๋๋ค.
_Both_์ ContentOrientation์ ์ฝํ ์ธ ๊ฐ ์ํ ๋ฐ ์์ง์ผ๋ก ์ ํ๋์ง ์์์ ์๋ฏธํฉ๋๋ค.
<ScrollViewer Width="500" Height="400" ContentOrientation="Both">
<Image Source="Assets/LargeEiffelTower.png"/>
</ScrollViewer>
์ด ์์์๋ ํญ์ ๋ ์คํฌ๋กค ๋ง๋๋ฅผ ๋ชจ๋ ์จ๊น๋๋ค. ์ฌ์ฉ์๋ ์ฌ์ ํ ์ด๋ ๋ฐฉํฅ์ผ๋ก๋ ์ฝํ ์ธ ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
<ScrollViewer Width="500" Height="400"
ContentOrientation="Both"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden">
<Image Source="Assets/LargeEiffelTower.png"/>
</ScrollViewer>
์ด ์์์ ๊ฐ๋ฐ์๋ ๋ง์ฐ์ค ํ ์ ๋ ฅ์ ๋ํด ์ฌ์ฉ์ ์ง์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ณ ํ์ ํตํด ์ฌ๊ฐ๋ฏธ ์ ํ ํ๊ฒฝ์ ์ง์ํ๋ ์บ๋ฒ์ค ๊ธฐ๋ฐ ์ฑ์ ๋ง๋ค๊ณ ์์ต๋๋ค. Touch์ ๊ฐ์ ๋ค๋ฅธ ์ ํ์ ํ์ฉํ๋ฉด์ ์ด๋ฌํ ์ ๋ ฅ ์ ํ์ ๋ฌด์ํ๋๋ก ScrollViewer๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
<ScrollViewer IgnoredInputKind="MouseWheel,Pen"
Width="500" Height="400"
ContentOrientation="Both" >
<SwapChainPanel x:Name="swapChainPanel" Width="40000" Height="40000">
...
</SwapChainPanel>
</ScrollViewer>
๊ฐ๋ฐ์๋ Slider์ ValueChanged ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉ์ ์ง์ ๊ธฐ๊ฐ์ ์ฌ์ฉํ์ฌ ScrollViewer์ VerticalOffset์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํฉ๋๋ค.
private void VerticalOffsetSlider_ValueChanged(
object sender,
RangeBaseValueChangedEventArgs e)
{
double verticalOffsetDelta = GetOffsetDelta();
TimeSpan animationDuration = GetCustomAnimationDuration();
// Initiate the scroll and enqueue the ScrollInfo we'll use to identify related events
ScrollInfo scrollInfo = _scrollViewer.ScrollBy(0.0, verticalOffsetDelta);
_myScrollRequests.Add(new MyScrollRequest(scrollInfo, animationDuration));
}
// Listen to the ScrollViewer's ScrollAnimationStarting event and customize
// the default animation
private void ScrollViewer_ScrollAnimationStarting(
ScrollViewer scrollViewer,
ScrollAnimationStartingEventArgs e)
{
MyScrollRequest myScrollRequest = _myScrollRequests.FindRequest(e.ScrollInfo);
e.Animation.Duration = myScrollRequest.AnimationDuration;
}
// Dequeue the ScrollInfo once the action completes
private void ScrollViewer_ScrollCompleted(
ScrollViewer scrollViewer,
ScrollCompletedEventArgs e)
{
_myScrollRequests.RemoveRequest(e.ScrollInfo);
}
Scroller๋ ๋ชจ๋ ํ์ ์ด๋ ๋ฐ ํ๋/์ถ์ ๋
ผ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ํฌ๋กฌ์ด ์๋ ์ ์์ค ๋น๋ฉ ๋ธ๋ก์
๋๋ค. ํ๋ซํผ์ ์ ์ฑ
์ด ํจ์ฌ ๋ ๋ฎ์ InteractionTracker ๋ฅผ XAML ํ๊ทธ ์นํ์ ์ธ ์์๋ก ๋ํํฉ๋๋ค.
๋ฌธ์ ๊ทธ๋๋ก Scroller๋ ScrollViewer์ "ํ์ ์์ญ"์ด๋ฉฐ ScrollContentPresenter๋ฅผ ๋์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Scroller๋ ScrollContentPresenter์ ๋ฌ๋ฆฌ ๋จ์ํ ์ฝํ
์ธ ๋ฅผ ํด๋ฆฌํํ๋ ๊ฒ ์ด์์ ์ํํฉ๋๋ค.
Scroller๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๊ณผ ํจ๊ป InteractionTracker๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์๋ก์ด ScrollViewer๋ Scroller๋ฅผ ๋ํํ๊ณ ํด๋น ์์ฑ์ ๊ณตํต ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด <ScrollViewer/>
๋ ์ํ ๋ฐ ์์ง ์คํฌ๋กค ์ํธ ์์ฉ์ ๋ชจ๋ ์ง์ํ๋๋ก Scroller๋ฅผ ๊ตฌ์ฑํ์ง๋ง ๊ธฐ๋ณธ ์ฌ์ฉ์ ๊ฒฝํ์ด ์์ง ์ ์ฉ ์คํฌ๋กค(์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ)๋ก ๋ํ๋๋๋ก ์ฝํ
์ธ ์ ๋๋น๋ฅผ ์ ํํฉ๋๋ค.
ScrollViewer๋ Scroller ์ฌ์ฉ์ ๋นํด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
์ฑ ๋ฐ ๋ง์ ์ปจํธ๋กค ์์ฑ์์ ๋ํ ๊ธฐ๋ณธ ์ ํ์ ScrollViewer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ํ๋ซํผ๊ณผ ์ผ์นํ๋ ๊ธฐ๋ณธ UX์ ๋ ํฐ ์ฌ์ฉ ํธ์์ฑ์ ์ ๊ณตํฉ๋๋ค. Scroller๋ ๊ธฐ๋ณธ UX/์ ์ฑ ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค(์: ํฅ์๋ FlipView ์ปจํธ๋กค ์์ฑ ๋๋ ํฌ๋กฌ ์๋ ์คํฌ๋กค ํ๋ฉด ์์ฑ).
๊ฐ๋ก ๋ฐ ์ธ๋ก ์คํฌ๋กค ๋ง๋์ ๊ธฐ๋ณธ๊ฐ์ _Auto_์ ๋๋ค. ์ฝํ ์ธ ๊ฐ ๋ทฐํฌํธ๋ณด๋ค ๋๊ฑฐ๋ ๋์์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์๋๊ฑฐ๋ ์จ๊ฒจ์ง๋๋ค.
์ ScrollViewer์ ์ฌ์ฉํ ์ ์๋ ์ด๊ฑฐํ ์ต์ ์๋ '๋นํ์ฑํ๋จ' ์ต์ ์ด ์์ต๋๋ค. ๋์ ๊ฐ๋ก ๋๋ ์ธ๋ก๋ก ์ด๋ํ๋ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์๋ตํ๋๋ก ์ปจํธ๋กค์ ๊ตฌ์ฑํ๋ ๊ฒ์ _HorizontalScrollMode_ ๋ฐ _VerticalScrollMode_ ์์ฑ์๋ง ๊ธฐ๋ฐํฉ๋๋ค.
namespace Microsoft.UI.Xaml.Controls
{
public enum ScrollBarVisibility
{
Auto = 0, // Only visible when the ZoomFactor * content size > viewport
Visible = 1, // Always visible
Hidden = 2 // Always hidden
}
}
์๋ ๊ทธ๋ฆผ์์ ๋ง์ฐ์ค ์ปค์๋ ์์ง ์คํฌ๋กค ๋ง๋ ์์ ์์ต๋๋ค. ์ฝํ
์ธ ๊ฐ ๋ทฐํฌํธ์ ๋๋น๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ณผ ์ ์๋ ์ ์ผํ ๊ฒ์
๋๋ค.
์ฝํ
์ธ ๊ฐ ๋ ์ฐจ์ ๋ชจ๋์์ ๋ทฐํฌํธ๋ณด๋ค ํฌ๋ฉด ์์ ์คํฌ๋กค ๋ง๋๊ฐ ๋ชจ๋ ํ์๋๊ณ ์ค๋ฅธ์ชฝ ํ๋จ ๋ชจ์๋ฆฌ์ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ํ์๋ฉ๋๋ค.
Scroller๋ _HorizontalScrollController_ ๋ฐ _VerticalScrollController_๋ฅผ _IScrollController_ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ ํ์ผ๋ก ์ค์ ํ์ฌ ์คํฌ๋กค์ ์ ์ดํ๋ โโ๋ํํ "์์ ฏ"์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ScrollBars๋ ์ด๋ฌํ ์์ ฏ์ ์น์ํ ์์ ๋๋ค. ScrollViewer๋ Scroller์ ์ด๋ฌํ ๋ ๊ฐ์ ์์ ฏ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ๋ฐ์๋ UI ์ค๋ ๋ ๋ ๋ฆฝ ์ ๋ ฅ์ ๋ํด Composition.Visual์ ์์กดํ๋ ์ฌ์ฉ์ ์ง์ IScrollController ๊ตฌํ์ ๋ง๋ค ์ ์์ต๋๋ค.
_scroller.HorizontalScrollController = new Acme.Slider(orientation: Orientation.Horizontal);
_scroller.VerticalScrollController = new Acme.Slider(orientation: Orientation.Vertical);
ํ๋ ์์ํฌ์๋ Windows 10 2018๋
4์ ์
๋ฐ์ดํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ์ ์ง์ ์คํฌ๋กค ์ปจํธ๋กค์ ๋น๋ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ํํฌ๊ฐ ๋
ธ์ถ๋์ด ์์ด์ผ ํฉ๋๋ค. ์ด์ ๋ฆด๋ฆฌ์ค๋ฅผ ๋์์ผ๋ก ํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ ํ ์ฌํญ์ด ์์ ์ ์์ต๋๋ค.
| ์ถ์ | ์ ํ | ์ด์ |
|:-:|:--|:-:|
| Windows 10 Fall Creators ์
๋ฐ์ดํธ(๋น๋ 16299) ๋ฐ ์ด์ | ํฌ์ปค์ค๋ฅผ ๋ฐ์ผ๋ฉด ์์๊ฐ ์๋์ผ๋ก ํ์๋์ง ์์ต๋๋ค. | UIElement์ BringIntoViewRequested ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
| | ์ปจํธ๋กค์ EffectiveViewportChanged ์ด๋ฒคํธ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค. ์์คํ
์์ ๋ ๋๋ง๋ ํฌ์ปค์ค ์ฌ๊ฐํ์ ๋ทฐํฌํธ์ ๊ฒฝ๊ณ๋ก ์๋ฆฌ์ง ์์ต๋๋ค. | UIElement์ RegisterAsScrollPort๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
```C#
๊ณต๊ฐ ํด๋์ค Microsoft.UI.Xaml.Controls.ScrollViewer : ์ปจํธ๋กค
{
์คํฌ๋กค ๋ทฐ์ด();
// Default Value: non-null instance
Windows.UI.Composition.CompositionPropertySet ExpressionAnimationSources { get; }
/*
// Default Value: Vertical
Microsoft.UI.Xaml.Controls.ContentOrientation ContentOrientation { get; set; };
// Default Value: 0.0
Double HorizontalOffset { get; };
// Default Value: 0.0
Double VerticalOffset { get; };
// Default Value: 1.0
Single ZoomFactor { get; };
// Default Value: 0.0
Double ExtentWidth { get; };
// Default Value: 0.0
Double ExtentHeight { get; };
// Default Value: 0.0
Double ViewportWidth { get; };
// Default Value: 0.0
Double ViewportHeight { get; };
// Default Value: 0.0
Double ScrollableWidth { get; };
// Default Value: 0.0
Double ScrollableHeight { get; };
// Default Value: Auto
M.UI.Xaml.Controls.ScrollBarVisibility HorizontalScrollBarVisibility {get;set;};
// Default Value: Auto
M.UI.Xaml.Controls.ScrollBarVisibility VerticalScrollBarVisibility {get;set;};
// Default Value: Collapsed
// Used for template binding the Visibility property of the horizontal
// ScrollBar in the control template
Visibility ComputedHorizontalScrollBarVisibility{ get; };
// Default Value: Collapsed
// Used for template binding the Visibility property of the vertical
// ScrollBar in the control template
Visibility ComputedVerticalScrollBarVisibility{ get; };
/*
// Default Value: Enabled
Microsoft.UI.Xaml.Controls.ScrollMode VerticalScrollMode { get; set; };
// Default Value: Disabled
Microsoft.UI.Xaml.Controls.ZoomMode ZoomMode { get; set; };
// Default Value: All
Microsoft.UI.Xaml.Controls.InputKind IgnoredInputKind { get; set; };
// Default Value: Idle
Microsoft.UI.Xaml.Controls.InteractionState State { get; };
// Default Value: Auto
Microsoft.UI.Xaml.Controls.ChainingMode HorizontalScrollChainingMode { get; set; };
// Default Value: Auto
Microsoft.UI.Xaml.Controls.ChainingMode VerticalScrollChainingMode { get; set; };
// Default Value: True
boolean IsHorizontalRailEnabled { get; set; };
// Default Value: True
boolean IsVerticalRailEnabled { get; set; };
// Default Value: Auto
Microsoft.UI.Xaml.Controls.ChainingMode ZoomChainingMode { get; set; };
// Default Value: None
M.UI.Xaml.Controls.SnapPointsType HorizontalSnapPointsType { get; set; };
// Default Value: None
M.UI.Xaml.Controls.SnapPointsType VerticalSnapPointsType { get; set; };
// Default Value: Near
M.UI.Xaml.C.Primitives.SnapPointsAlignment HorizontalSnapPointsAlignment { g;s; };
// Default Value: Near
M.UI.Xaml.C.Primitives.SnapPointsAlignment VerticalSnapPointsAlignment { g;s; };
// Default Value: 0.95, 0.95
Windows.Foundation.Numerics.Vector2 ScrollInertiaDecayRate { get; set; };
// Default Value: 0.95
Single ZoomInertiaDecayRate { get; set; };
// Default Value: 0.1
Double MinZoomFactor { get; set; };
// Default Value: 10.0
Double MaxZoomFactor { get; set; };
// Default Value: 0.0
Double HorizontalAnchorRatio { get; set; };
// Default Value: 0.0
Double VerticalAnchorRatio { get; set; };
// Forwarded to inner Scrollerโs IScrollAnchorProvider implementation
// Default Value: null
Windows.UI.Xaml.UIElement CurrentAnchor { get; };
/*
// Asynchronously scrolls to specified offsets with optional animation,
// with optional snap points respecting. Returns a ScrollInfo struct.
Microsoft.UI.Xaml.Controls.ScrollInfo ScrollTo(
double horizontalOffset,
double verticalOffset,
Microsoft.UI.Xaml.Controls.ScrollOptions options);
// Asynchronously scrolls by the provided delta amount.
// Allows animation, respects snap points. Returns a ScrollInfo struct.
Microsoft.UI.Xaml.Controls.ScrollInfo ScrollBy(
double horizontalOffsetDelta,
double verticalOffsetDelta);
// Asynchronously scrolls by the provided delta amount with
// optional animation, with optional snap points respecting.
// Returns a ScrollInfo struct.
Microsoft.UI.Xaml.Controls.ScrollInfo ScrollBy(
double horizontalOffsetDelta,
double verticalOffsetDelta,
Microsoft.UI.Xaml.Controls.ScrollOptions options);
// Asynchronously adds scrolling inertia. Returns a ScrollInfo struct.
Microsoft.UI.Xaml.Controls.ScrollInfo ScrollFrom(
Vector2 offsetsVelocity,
Nullable<Vector2> inertiaDecayRate);
// Asynchronously zooms to specified zoom factor. Allows animation
// (respects snap points in v2). Returns a ZoomInfo struct.
Microsoft.UI.Xaml.Controls.ZoomInfo ZoomTo(
float zoomFactor,
Nullable<Vector2> centerPoint);
// Asynchronously zooms to specified offsets with optional animation
// (with optional snap points respecting in v2). Returns a ZoomInfo struct.
Microsoft.UI.Xaml.Controls.ZoomInfo ZoomTo(
float zoomFactor,
Nullable<Vector2> centerPoint,
Microsoft.UI.Xaml.Controls.ZoomOptions options);
// Asynchronously zooms by the provided delta amount. Allows animation
// (respects snap points in v2). Returns a ZoomInfo struct.
Microsoft.UI.Xaml.Controls.ZoomInfo ZoomBy(
float zoomFactorDelta,
Nullable<Vector2> centerPoint);
// Asynchronously zooms by the provided delta amount with optional animation
// (with optional snap points respecting in v2). Returns an ZoomInfo struct.
Microsoft.UI.Xaml.Controls.ZoomInfo ZoomBy(
float zoomFactorDelta,
Nullable<Vector2> centerPoint,
Microsoft.UI.Xaml.Controls.ZoomOptions options);
// Asynchronously adds zooming inertia. Returns a ZoomInfo struct.
Microsoft.UI.Xaml.Controls.ZoomInfo ZoomFrom(
float zoomFactorVelocity,
Nullable<Vector2> centerPoint,
Nullable<float> inertiaDecayRate);
/*
/*
// Raised when any of the ExtentWidth and ExtentHeight dependency property changed.
event TypedEventHandler<ScrollViewer, Object> ExtentChanged;
// Raised when the State dependency property changed.
event TypedEventHandler<ScrollViewer, Object> StateChanged;
// Raised when a ScrollTo or ScrollBy call triggers an animation.
// Allows customization of that animation.
event TypedEventHandler<ScrollViewer, Microsoft.UI.Xaml.Controls.ScrollAnimationStartingEventArgs>
ScrollAnimationStarting;
// Raised when a ZoomTo or ZoomBy call triggers an animation.
// Allows customization of that animation.
event TypedEventHandler
<ScrollViewer, Microsoft.UI.Xaml.Controls.ZoomAnimationStartingEventArgs>
ZoomAnimationStarting;
// Raised at the end of a ScrollTo, ScrollBy, or ScrollFrom asynchronous
// operation. Provides the original ScrollInfo struct.
event TypedEventHandler
<ScrollViewer, Microsoft.UI.Xaml.Controls.ScrollCompletedEventArgs>
ScrollCompleted;
// Raised at the end of a ZoomTo, ZoomBy, or ZoomFrom asynchronous operation.
// Provides the original ZoomInfo struct.
event TypedEventHandler
<ScrollViewer, Microsoft.UI.Xaml.Controls.ZoomCompletedEventArgs>
ZoomCompleted;
// Raised at the beginning of a bring-into-view-request participation.
// Allows customization of that participation.
event TypedEventHandler
<ScrollViewer, Microsoft.UI.Xaml.Controls.BringingIntoViewEventArgs>
BringingIntoView;
// Raised to allow the listener to pick an anchor element, when anchoring
// is turned on.
event TypedEventHandler
<ScrollViewer, Microsoft.UI.Xaml.Controls.AnchorRequestedEventArgs>
AnchorRequested;
/*
static DependencyProperty IgnoredInputKindProperty { get; };
static DependencyProperty HorizontalScrollModeProperty { get; };
static DependencyProperty VerticalScrollModeProperty { get; };
static DependencyProperty ZoomModeProperty { get; };
static DependencyProperty HorizontalScrollChainingModeProperty {g};
static DependencyProperty VerticalScrollChainingModeProperty {g};
static DependencyProperty IsHorizontalRailEnabledProperty {g};
static DependencyProperty IsVerticalRailEnabledProperty {g};
static DependencyProperty ZoomChainingModeProperty { get; };
static DependencyProperty MinZoomFactorProperty { get; };
static DependencyProperty MaxZoomFactorProperty { get; };
static DependencyProperty HorizontalAnchorRatioProperty { get; };
static DependencyProperty VerticalAnchorRatioProperty { get; };
}
```
์ ์๊ฐ์๋ ์คํฌ๋กค์ด ๊ฐ๋ฅํ ์ฝํ
์ธ ์ ํ๋/์ถ์๊ฐ ๊ฐ๋ฅํ ์ฝํ
์ธ ์ ํ์์ฑ์ ๋งค์ฐ ๋ค๋ฆ
๋๋ค. ์ฝํ
์ธ ๊ฐ ํ๋/์ถ์๋๋ฉด ์คํฌ๋กคํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ด๋ฌํ ๋ณ๋์ ์ปจํธ๋กค์ ๋ง๋๋ ๊ฒ์ ๋ํ ๊ณ ๋ ค๊ฐ ์์๋์ง ๊ถ๊ธํฉ๋๋ค. ์คํฌ๋กค๋ง์์ ํ์ฅ๋๋ ํ๋/์ถ์ ๊ฐ๋ฅํ ์ปจํธ๋กค์ด ์์ ์ ์์ต๋๋ค.
๋ด ๊ด์ฌ์ฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 1) ๋๋ถ๋ถ์ ์ฌ๋๋ค์๊ฒ ํ์ํ์ง ์์ ํ๋/์ถ์ ๊ด๋ จ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ScrollViewer๊ฐ ์ง๋์น๊ฒ ๋ณต์กํด์ก์ต๋๋ค. 2) ScrollViewer๊ฐ ์ง์ํ๋ ์ฝํ
์ธ ํ๋ ์ปจํธ๋กค์ ์ฐพ๋ ์ฌ๋์๊ฒ๋ ๋ถ๋ช
ํ์ง ์์ต๋๋ค.
๋ํ ์ ์ ๋ด์์ ์คํฌ๋กค ๋ทฐ์ด ๋ด์์ ํน์ ์์๋ก ์คํฌ๋กคํ๋ ๊ธฐ๋ฅ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก ์ด๊ฒ์ ๊ฐ๋ฐ์๊ฐ ๊ทธ ์์ ์๋ ๋ชจ๋ ํญ๋ชฉ์ ์ธก์ ํ ๋ค์ ์ ์ ํ ์คํ์
์ผ๋ก ์คํฌ๋กคํ์ฌ ์ํํ ์ ์์ง๋ง ๊ฐ์ํ๋ ๋ชฉ๋ก์์๋ ์ํํ๊ธฐ ์ด๋ ค์ธ ์ ์์ผ๋ฉฐ (๋ด ์๊ฐ์) ๋ง์ ์ฑ( ๋ฐ ๊ฐ๋ฐ์)๋ ์ด๊ฒ์ด ๋ด์ฅ๋์ด ํํ์ ๋ณผ ๊ฒ์
๋๋ค.
ํญ๋ชฉ์ด "๋ชฉ๋ก"์ ์ถ๊ฐ๋๊ณ ๊ฐ๋ฐ์๊ฐ ํญ๋ชฉ์ด ํ์๋๋๋ก ํ๋ ค๋ ์์น๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋๋ ๋ชฉ๋ก ์๋์ ์๋ ์ธ๋ถ ํญ๋ชฉ์์ ํ์ด์ง๊ฐ ์ด๋ฆฌ๋ ๋ง์คํฐ/์ธ๋ถ ์ ๋ณด ๋ณด๊ธฐ๊ฐ ์๋ ํ์ด์ง๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์์ธํ ๋ด์ฉ.
๋ง์ฐฌ๊ฐ์ง๋ก, ์คํฌ๋กค ๊ฐ๋ฅํ ์์ญ ๋ด์ ๋ค๋ฅธ ํญ๋ชฉ์ด ์๊ฐ์ ํธ๋ฆฌ์์ ์ ๊ฑฐ(๋๋ ์ถ๊ฐ)๋๋ ๋์ ํญ๋ชฉ์ด ๋ณด์ด๋ ์์ญ์ ์ ์ง๋๋๋ก ํ๋ ๊ฒ๋ ์ ์ฉํฉ๋๋ค. ์ด ์์
์ ์ํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ํ์คํ์ง ์์ง๋ง ๋ฐฑ๊ทธ๋ผ์ด๋(๋๋ UI ์ธ๋ถ ์ค๋ ๋) ์์
์ด ์คํฌ๋กค ๊ฐ๋ฅํ ์์ญ์ ๋ค๋ฅธ ํญ๋ชฉ์ ์ ๊ฑฐํ๊ฑฐ๋ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์คํฌ๋กค ๊ฐ๋ฅํ ์์ญ ๋ด์์ ์ ํํ ํญ๋ชฉ์ด ์ด๋ํ ๋ ๋งค์ฐ ๋์ฉ๋๋ค.
ํญ๋ชฉ์ ํด๋ฆญ/ํญํ ๋ ํญ๋ชฉ์ ์ด๋ํ๋ฉด ๋์ฐํ ์ฌ์ฉ ๊ฒฝํ์ด ์๊น๋๋ค. ์ด์ ์ ๋ง์ถ๊ฑฐ๋ ์ ํํ ํญ๋ชฉ์ด ๊ฐ์ ์์ญ ๋ฐ์ผ๋ก ์ด๋ํ๋ฉด ์ ๊ทผ์ฑ ๋๊ตฌ ๋ฐ ํ๋ฉด ํ๋
๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
์ฃผ๋ณ ์ฌ๋๋ค์ด ์ด๋ํ๋ ๋์(ํนํ ํด๋น ํญ๋ชฉ์ด ๋ค๋ฅธ ๊ณณ์์ ์ญ์ ๋ ๊ฒฝ์ฐ) ๋์ผํ ์์น์ ํญ๋ชฉ์ ์ ์งํ๋ ค๊ณ ํ๋ฉด ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ์์ง๋ง ์๋ฌด ๊ฒ๋ ํ์ง ์๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
@mrlacey ๊ฐ์ฌํฉ๋๋ค. ๊ธฐ์กด ScrollViewer์ ์ด ์ ์์์ ํ๋/์ถ์ ๊ธฐ๋ฅ์ด ์ผ๋ง๋ ๋ฐ๊ฒฌ๋์ง ์๋์ง ์ ์ ์์ต๋๋ค. ๊ธฐ์กด UWP ScrollViewer(์๋ง๋ ๋ ๋์ ๋ฐฉ๋ฒ?)์์ ์ถ๋ฐํ๋ ๋ ๋ค๋ฅธ ์ง์ ์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ ๋ก ์ ์ํ ๊ณต๊ฐ ์ง๋ฌธ์ผ๋ก ์ถ๊ฐํ์ต๋๋ค.
๊ฐ์ํ๋ ๋จผ์ ํน์ ์์๋ฅผ ์์ฑํ๊ณ ๋ ์ด์์ ์์คํ ์ ํตํด ์คํํ ๋ค์ ์คํฌ๋กคํ ์ ์๋ ์์น๋ฅผ ํ๋ณดํด์ผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ์ ๊น๋ค๋กญ๊ฒ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ด ๊ณผ๊ฑฐ์ ํน์ ์ปจํธ๋กค(์: ListView)์ ์์ ์์ ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ๋ ์์ฒด ScrollIntoView ๋ฉ์๋ ๊ฐ ์์๋ ์ด์ ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ด ๊ตฌ์ํ๊ณ ์๋ ๋ฐฉ๋ฒ์ ์ ํ์ ๋๊น? ๋๋ ๋ชจ๋ UIElement์๋ ํญ๋ชฉ์ผ๋ก ๋งค์ฐ ์ฝ๊ฒ ์คํฌ๋กคํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ StartBringIntoView ๋ฉ์๋ ๊ฐ ์์ผ๋ฉฐ ๋ทฐ๋ก ๊ฐ์ ธ์ฌ ๋ ๋ทฐํฌํธ์ ์์น๋ฅผ โโ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๋
Re: ๋ค๋ฅธ ๋ด์ฉ์ด ์ถ๊ฐ/์ ๊ฑฐ๋๊ฑฐ๋ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ํญ๋ชฉ์ ์์น๋ฅผ โโ์ ์งํ๋ ๊ฒ... ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๊ฒ์ด ์ข์ง ์๋ค๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์คํฌ๋กค ๊ณ ์ ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ ์ด์ ์ ๋๋ค. :) ๊ณผ๊ฑฐ์๋ ListView/GridView์ฉ ๊ฐ์ํ ํจ๋์ ๋ด์ฅ๋์ด ์๋ ๊ฑฐ์ ์๋ ค์ง์ง ์์ ๊ธฐ๋ฅ์ ๋๋ค. ์ต๊ทผ ๋ฆด๋ฆฌ์ค์์ ์ฐ๋ฆฌ๋ ์ด์ ๊ฐ์ ๊ฒ์ ListView์์๋ง ์ฌ์ฉํ ์ ์๋ ๊ฒ๊ณผ ๋ถ๋ฆฌํ๊ธฐ ์ํด ๋ช ์์ ์ธ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์์ต๋๋ค.
ํ์ฅ๋ ScrollViewer์ ๋ํ ์์ด๋์ด๋ฅผ ํ์ํ๋ ค๋ ๊ฒฝ์ฐ Fluent Design ํ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋ z ๊น์ด ๊ฐ์ผ๋ก ์์ฐจ ๋ฐ ํญ๋ชฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์กฐ์ธํ ์ ์์ต๋๋ค.
XAML์ด MR ์ฑ์ 3D ํํ์ผ๋ก ์ด๋ํ๊ณ ๊น์ด ๋ฐ ๊ทธ๋ฆผ์๊ฐ 2D XAML๋ก ์ด๋ํจ์ ๋ฐ๋ผ - ์คํฌ๋กค์ด ๋ค๋ฅธ ๊น์ด ๊ฐ์ ํญ๋ชฉ์ ์ด๋ํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆผ์๊ฐ ์คํฌ๋กค ํ์๊ธฐ์ ์ ๋๋ ๋ค์ ๋ ๋๋ง๋๋ ๋ฐฉ๋ฒ ๋ฐ ์๋ฆด ์ ์๋ ๊ธฐํ ๋ฌธ์ XAML ํ์ 3D ์คํ์์ - Windows UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฒ์ฒํ ์ ๊ธฐ๋ณธ๊ฐ์ด ๋จ์ ๋ฐ๋ผ ์ ๊ธฐ๋ณธ๊ฐ์ด ๋ ์ ์๋ ํญ๋ชฉ์ ๋น๋ํ ์ ์์ต๋๋ค.
์ ์๊ฐ์๋ ์คํฌ๋กค์ด ๊ฐ๋ฅํ ์ฝํ ์ธ ์ ํ๋/์ถ์๊ฐ ๊ฐ๋ฅํ ์ฝํ ์ธ ์ ํ์์ฑ์ ๋งค์ฐ ๋ค๋ฆ ๋๋ค.
์น ๋ธ๋ผ์ฐ์ , ๊ทธ๋ํฝ ๋์์ธ ์ฑ, ์คํผ์ค ์ฑ, PDF ๋ทฐ์ด๋ฅผ ์ ์ธํ๊ณ ์ฝํ ์ธ ๋ฌธ์๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ชจ๋ ๊ฒ.
@mrlacey ์ ํจ๊ป ํน์ ์์๋ฅผ ๋ณด๊ธฐ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๋ณด๊ธฐ์์ ํ์๋๋ ์์น(์๋จ, ์ค์, ํ๋จ ๋ฑ...)๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ํ ์์๊ฐ ์์ ํ ๋ณด์ด๋์ง ์๋ฆฌ๋์ง ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์๊ฐ ์ด๋ฏธ ์ ์ฒด ๋๋ ๋ถ๋ถ์ ์ผ๋ก ๋ณด๊ธฐ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ ๊ฒฝ์ฐ ์์๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ณด๊ธฐ๋ฅผ ์คํฌ๋กคํ ํ์๊ฐ ์์ต๋๋ค.
๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค! ์ฑ์ด ๋งํฌ์ ์ ์ค์ ํ๋ ๊ฒฝํฅ์ด ์๋ ์์ฑ๊ณผ *ScrollMode ๋ฐ *ScrollBarVisibility ๋ฐ๋ก ๋ค์ ZoomMode๊ฐ ํ์๋๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ผ๋ถ ์๊ฒฉ ๋ถ์์ ์์งํ์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฑ์ ์์ฑ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ScrollMode ๋ฐ ScrollBarVisibility ์์ฑ์ด ์ค์ ๋ ๋ ๋ด๊ฐ ๊ด์ฐฐํ ๊ฒ์ ์ฝํ ์ธ ์์ ์ํ ์คํฌ๋กค์ ํ์ฑํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๋ ๊ฒ์ ๋๋ค. ContentOrientation ์์ฑ์ ๋์ ์ ์ด๋ฅผ ์ฝ๊ฒ ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ๊ฐ๋ก ์คํฌ๋กค ํ ๋ค์์ผ๋ก ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ํ๋/์ถ์์ ๋๋ค.
ํ๋/์ถ์์ ๊ฒ์ ๊ฐ๋ฅ์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ณ๋์(ํ์๋) ์ปจํธ๋กค์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ์ฌ๋ฐ๋ฅธ ๋ฌธ์/์ํ์ด ๋ ํจ๊ณผ์ ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์ ๋๋ ์ปจํ ์คํธ ์ด๊ฑฐํ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
ScrollViewer.ScrollBehaviour = ScrollBehaviour.Zoom;
ScrollViewer.ScrollBehaviour = ScrollBehaviour.Scroll;
ScrollViewer.ScrollBehaviour = ScrollBehaviour.ParallaxScroll;
ScrollViewer.ScrollBehaviour = ScrollBehaviour.Zoom;
๋ ๋งค์ฐ ํผ๋์ค๋ฝ์ต๋๋ค. ZoomMode
๋ ๊ทธ๋๋ก ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ScrollViewer.ScrollBehaviour = ScrollBehaviour.Zoom;
๋ ๋งค์ฐ ํผ๋์ค๋ฝ์ต๋๋ค.ZoomMode
๋ ๊ทธ๋๋ก ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์คํฌ๋กค์ด ์๋ ํ๋/์ถ์ ์ฝํ ์ธ ์ ๋ํ ํ์๋ ์ปจํธ๋กค์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ์๊ฒฌ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ์ ์์ ์์ํด์ผ ํ์ ๊ฒ์ ๋๋ค.
๋์๊ฒ๋ ํนํ ํฐ์น ์ฅ์น์์ ScrollViewer
๋ด์ฅ ์ค ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ์ด ์ค์ ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค. ํ์ฌ UWP์ ์ด๋ฏธ์ง/์ปจํธ๋กค์์ ์์ ํ ์ด๋/ํ๋/์ถ์/ํ์ ์ ์ํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์์ผ๋ฉฐ StackOverflow ๋ฐ GitHub์์ ๋ง์ ๊ด๋ จ ์ง๋ฌธ์ด ์ ๊ธฐ๋์์ต๋๋ค(์: ๋๋๊ทธ ๊ฐ๋ฅํ ์ฝํ
์ธ ์ปจํธ๋กค ์ถ๊ฐ ).
@micahl , ๋๋ ํ๋/์ถ์๋ก ๊ฐ์ ํ๊ณ
ํ์ ์ ์ค์ฒ ์ง์
์ด ์๋๋ฆฌ์ค๋ ๋ฏธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๊น?
๋์๊ฒ๋ ํนํ ํฐ์น ์ฅ์น์์
ScrollViewer
๋ด์ฅ ์ค ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ์ด ์ค์ ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค. ํ์ฌ UWP์ ์ด๋ฏธ์ง/์ปจํธ๋กค์์ ์์ ํ ์ด๋/ํ๋/์ถ์/ํ์ ์ ์ํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์์ผ๋ฉฐ StackOverflow ๋ฐ GitHub์์ ๋ง์ ๊ด๋ จ ์ง๋ฌธ์ด ์ ๊ธฐ๋์์ต๋๋ค(์: ๋๋๊ทธ ๊ฐ๋ฅํ ์ฝํ ์ธ ์ปจํธ๋กค ์ถ๊ฐ ).
ํ๋/์ถ์ ๋ฐ ์คํฌ๋กค์ ๋ํ ๋ ๋ง์ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ...
ScrollViewer.ScrollBehaviour = ScrollBehaviour.ZoomAndScroll;
๊ทธ๋ฌ๋ ํฐ์น ์ฅ์น์์๋ ์๊ฐ๋ฝ์ ๊ผฌ์ง๊ฑฐ๋ ๋ฏธ๋๋ฌ์ง๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ํฐ์น ์์ด ํ๋ํ๋ ค๋ฉด [ + ] ๋ฐ [ ] ๋ฒํผ์ด ๋ํ๋์ผ ํฉ๋๋ค. ๋๋ ํ๋/์ถ์ ์ ์ฉ์ธ ๊ฒฝ์ฐ ์คํฌ๋กค ๋ง๋ ์ธ ๋๋๊ทธ๊ฐ ํ๋ ๋ฐ ์ถ์๋ฉ๋๋ค.
Microsoft Word UI๋ฅผ ๋ณด๋ฉด ์ํ ํ์์ค์ ํ๋/์ถ์ ์ปจํธ๋กค์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ์์ญ์ ์คํฌ๋กค๋ฐ.
๋ง์ฐ์ค ํ๋/์ถ์ ์ง์์ด ์๋ก์ด ScrollViewer ์ปจํธ๋กค์ ๋ด์ฅ๋์ด์ผ ํฉ๋๊น? ๋ฐ๋ผ์ ZoomMode๊ฐ ์ผ์ ธ ์๊ฑฐ๋ ๋์ ์์ฑ์์ ํ๋/์ถ์๋ฅผ ํ์ฉํ๋ฉด ๋ํ๊ธฐ ๋ฐ ๋นผ๊ธฐ ๋ฒํผ์ด ๋ํ๋ฉ๋๊น?
@JustinXinLiu ํ์ ์ ์ค์ฒ๋ฅผ ์ง์ํ๋ ค๋ฉด InteractionTracker(@likuba)์ ์ง์์ด ํ์ํ ์ ์์ต๋๋ค.
@mdtauk ์๋ก์ด ScrollViewer๋ ๊ธฐ์กด ScrollViewer์ ์ ์ฌํ Ctrl + ๋ง์ฐ์คํ ์ ํตํ ๋ง์ฐ์คํ ํ๋/์ถ์๋ฅผ ์ง์ํฉ๋๋ค. ํ๋/์ถ์๊ฐ ํ์ฑํ๋์ด ์์ ๋ ์ปจํธ๋กค์ ๊ธฐ๋ณธ ํ๋ฌ์ค/๋ง์ด๋์ค ๋ฒํผ์ด ์์ด์ผ ํ๋์ง ์ฌ๋ถ๊ฐ ๋ถ๋ถ๋ช ํฉ๋๋ค. ๋ด ํ์ฌ ์ธ์์ ์ผ๋ฐ์ ์ผ๋ก ํ๋/์ถ์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ข ๋ฅ์ ์ฑ(์: ์ฝํ ์ธ ๋ฌธ์ ์ฑ)์ด ๋ค์ํ ๋ฐฉ์์ผ๋ก ํด๋น ๋ฒํผ์ ์ฑ ๊ฒฝํ์ ํตํฉํ๋๋ก ์ ํํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ผ์ด๋๋ก ๊ตฌ๋ถ๋ ์ํ ํ์์ค์ - / +(์: Office) ๋๋ ๋ค๋ฅธ ๋ช ๋ น(์: ์ง๋) ์๋์ ์์ง์ผ๋ก ๋ํ๋๋ ๋จ์ํ -/+.
@micahl ์ ScrollFrom์ด ๊ทธ๋ ๊ฒ ๋ถ๋ฆฌ๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ScrollBy์ ๋น์ทํ์ง๋ง ์๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๊น?
@adrientetar ๋ ScrollFrom์ ์ด๋ฆ์ ์ง์ ํ๋ ๋์ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์ ์ธํธ๋ก ScrollBy์ ๋ ๋ค๋ฅธ ์ค๋ฒ๋ก๋๊ฐ ์๋ ์ด์ ๋ฅผ ๋ฌป๊ณ ์์ต๋๊น?
๋ค ๐ ํ์ง๋ง ScrollFrom ๋ค์ ์๋ ๊ฐ๋ ์ ์ฃผ์ด์ง ์๋๋ก ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค. ์ฃผ์ด์ง ์ง์ ์ผ๋ก ์ด๋ํ๋ ScrollBy์ ๋์กฐ๋ฉ๋๋ค.
์ข์์. 3๊ฐ์ง ์ํฉ์ ์ผ๋์ ๋์์ต๋๋ค.
ํ์์ ์๋๋ฆฌ์ค๋ ๊ฒฝํ์ ํฌํ๊ธฐ ์ํด ๋ง์ฐ์คํ ํด๋ฆญ๊ณผ ๊ฐ์ ๊ฒ์ผ ์ ์์ต๋๋ค. ํด๋ฆญํ์ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ปค์์ ์์น์ ๋ฐ๋ผ ํ์ฌ ์์น(๋ฌด์์ด๋ ๊ฐ์)์์ ์ผ๋ถ ๊ด์ฑ์ด ์ฝ์ ๋ฉ๋๋ค.
๋๋ถ์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ๋ด ์์ ์ ๋ง์ฐ์ค ํ ํด๋ฆญ ๊ฒฝํ์ ์ํด ScrollBy๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง ํน์ ๊ฒฝ์ฐ์ ScrollFrom์ด ์ ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํ์ฌ ScrollViewer ์ปจํธ๋กค์์๋ ViewportWidth ๋ฐ ViewportHeight ์์ฑ์ ๋ฐ์ธ๋ฉํ ์ ์์ง๋ง ํ์ฌ ์ ScrollViewer ์ปจํธ๋กค์์๋ ๋ถ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฑฐ ์ถ๊ฐ๋๋์?
@lhak , ๊ทธ ๊ฐ์ ๋ฌด์์ ๋ฌถ๊ฒ ์ต๋๊น? ์ถ๊ฐํด๋ ํฐ ๋ณํ๋ ์์ ๊ฒ์ ๋๋ค. ์๋๋ฆฌ์ค์ ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ฐ์ธ๋ฉ๋ณด๋ค๋ ๊ถ์ฅํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ์์ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ๋์์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ด๋ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ์ฐจ์ด์ ์ ๋ฏผ๊ฐํ๊ธฐ๋ฅผ ์ํ์ง๋ง ๋ ๋์ ๋์์ ํ๋ณดํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
@micahl ๋๋ ๊ณผ๊ฑฐ์ ์ผ๋ถ ๊ณ์ฐ์๋ ํด๋น ๊ฐ์ ์ฌ์ฉํ๋ค๊ณ ํ์ ํฉ๋๋ค. ๋ด๊ฐ ๊ทธ๋ค์๊ฒ ๋ฌถ์ฌ ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
@michael-hawker๋ ๋ถ๋ช ํ ScrollViewer์์ ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์๋ API์์๋ DependencyProperties๊ฐ ์๋ ์ผ๋ฐ ์์ฑ์ผ๋ก ๋ ธ์ถ๋ฉ๋๋ค. ์ด๋ฌํ ๋์ผํ ๊ฐ์ ๋๊ตฐ๊ฐ๊ฐ ์ปดํฌ์ง์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ ฅ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋น๋ํ๋ ์ํฉ์ ๋ํด ExpressionAnimationSources ์์ฑ์ ์ผ๋ถ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ฌ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ค์๊ณผ ์ ์ฌํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
<ScrollViewer x:Name="outputScrollViewer">
<Viewbox MaxWidth="{x:Bind outputScrollViewer.ViewportWidth, Mode=OneWay}" MaxHeight="{x:Bind outputScrollViewer.ViewportHeight, Mode=OneWay}">
<TheXamlElement Width=X Height=Y/>
</Viewbox>
</ScrollViewer>
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ก ์ธ๋ก ๋น์จ์ ์ ์งํ๋ฉด์ ๋ด๋ถ xaml ์์(๊ณ ์ ํฌ๊ธฐ)๋ฅผ ์คํฌ๋กค/ํ๋/์ถ์ํ ์ ์์ต๋๋ค. ๋์์ xaml ์์๊ฐ ์คํฌ๋กค ๋ทฐ์ด์ ๋ทฐํฌํธ๋ณด๋ค ๊ฒฐ์ฝ ์์ง ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ์ฌ์ง ์ฑ๊ณผ ์ ์ฌํฉ๋๋ค.
@lhak , ์ข์ ์๋๋ฆฌ์ค! ์ด ์๋๋ฆฌ์ค๊ฐ ํ์ฌ ์ ์์ ์ด๋ป๊ฒ ์์ฉ๋ ์ ์๋์ง ํฐ ์๋ฆฌ๋ก ์๊ฐํ๋ ์ค... ContentOrientation ์์ฑ์ ๋ค๋ฅธ ์ต์ ์ ์ถ๊ฐํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค . ์ ์์์ ํ์ฌ ์ต์ :
๋ค ๋ฒ์งธ ์ต์
์ ๋ ์ด์์ ์ค ๋์ด์ ๋๋น๋ฅผ ๋ทฐํฌํธ ํฌ๊ธฐ๋ก ์ ํํ๋ ๊ฒ์
๋๋ค. ๋น๋ถ๊ฐ์ ์ด๊ฒ์ "Viewport" ๋ฐฉํฅ์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ด๋ฆ ์ง์ ์ ๋ํด ์๊ฐ๋ฆฐ ๋ฐ์์ด ์์ต๋๋ค.
์ ์ด๋ (๋ ์ผ๋ฐ์ ์ธ?) ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ๋ ์ด์์ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก "์ฌ๋ฐ๋ฅธ ๊ฒ"์ด ๋ฐ์ํด์ผ ํ๋ฏ๋ก Viewbox์ ๋ฐ์ธ๋ฉ์ด ๋ถํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
<ScrollViewer ContentOrientation="Viewport">
<Image Stretch="Uniform" .../>
</ScrollViewer>
๋ ๋ณต์กํ ์ฝํ ์ธ ์ ๊ฒฝ์ฐ Viewbox์ ๋ํํ๊ณ ๋ฐ์ธ๋ฉ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค.
<ScrollViewer ContentOrientation="Viewport">
<Viewbox>
<TheXamlElement Width=X Height=Y/>
</Viewbox>
</ScrollViewer>
@micahl ๋ ๋ค๋ฅธ ์ง๋ฌธ์ด ์์ต๋๋ค. ํ๋/์ถ์๋ฅผ ๋ ๋น ๋ฅด๊ฒ(๋ ํฌ๊ฒ ์ฆ๊ฐ) ๋ง๋ค๊ณ ์ค๋ฌด๋ฉ ์ ๋๋ฉ์ด์ ์ ์ ๊ฑฐํ๊ธฐ ์ํด Scroller์ ๋ง์ฐ์ค ํ ์ฒ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ต๋๋ค. ํ ์ค์ ์กฐ์ ํ๋ API๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ฐ์ค ํ ์ด๋ฒคํธ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผํฉ๋๊น?
๋ง์ฐ์ค ํ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ ์๋ ์์ง๋ง ์ปจํธ๋กค์ด ํ๋ ์ผ์ ๋ค์ ๊ตฌํํด์ผ ํ๋ ๊ฒ์ผ๋ก ๋ฐํ์ง๋ฉด ๋ถํํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ์ด ์ถ๊ตฌํ๋ ๊ฒ์ ๋ฌ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ง๋ ZoomInertiaDecayRate๋ฅผ 1.0์ ๊ฐ๊น์ด ๊ฐ์ผ๋ก ์ค์ ํ ๋ค์ ๋ฐ๋ณต๋๋ ํ๋/์ถ์ ์ค๋ ์ง์ ์ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ZoomInertiaDecayRate ์์ฑ์ ์ถ๊ฐํ๊ณ ํ์ ์ค๋ ํฌ์ธํธ์ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์์ ํ๋ฉด ์๋ํด ๋ณผ ๋งํ ๊ฒ์ ๋๋ค.
๊ทธ๋๋ ์๋ํ์ง ์์ผ๋ฉด IgnoredInputKind="Mousewheel"์ ์ค์ ํ ๋ค์ Scroller๋ฅผ ํ์ ๋ถ๋ฅํ์ฌ OnPointerWheelChanged๋ฅผ ์ฌ์ ์ํ๊ฑฐ๋ Scroller์ PointerWheelChanged ์ด๋ฒคํธ์ ๋ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ง์ ์ฒ๋ฆฌํ๋๋ก ๋์ฒดํ ์ ์์ต๋๋ค.
@micahl ๊ฐ์ฌํฉ๋๋ค! ๋ง์ฐ์ค ํ ๋์์ ๋ณด์ ํ ์๋๋ฆฌ์ค๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก Adobe XD์ ๊ฐ์ ๋ฐฉ์์ด ๋ง์์ ๋ญ๋๋ค. ์ฝ๊ฐ์ ๊ฐ์ ์ ๋๋ฉ์ด์ ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋น ๋ฅด๊ณ ์ถฉ๋ถํ ํ๋/์ถ์ ์ฆ๊ฐ๊ฐ ์์ต๋๋ค. ์คํฌ๋กค๋ฌ ๋ง์ฐ์ค ํ ํ๋/์ถ์ ์ ๋๋ฉ์ด์ ์ ์ฝ๊ฐ ๋๋ฆฌ๊ณ ํ๋/์ถ์ ์ฆ๊ฐ๊ฐ ์ ๋ง ์์ต๋๋ค.
@adriantetar , ์ข์ ํผ๋๋ฐฑ. ์กฐ์ ํด ๋ณผ ์ ์์ต๋๋ค.
์ฆ๋ถ ๋ฐ ๊ฐ์ ์ ์ดํ๋ โโ๋ชจ๋ ์ข ๋ฅ์ ๋ณ์ - ์ฌ์ ์ ๊ฐ๋ฅํ ์์ฑ์ผ๋ก ๋ง๋ค ์ ์์
์ค๋ฅธ์ชฝ. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ง๋ฉดํ ํ ๊ฐ์ง ๋ฌธ์ ๋ Win10 ๋ฒ์ 1809 ์ด์์์ ์ปจํธ๋กค์ด ๋ง์ฐ์ค ํ ์ ๋ ฅ์ ๊ธฐ๋ณธ InteractionTracker์ ์ ๋ฌํ์ฌ ๋ถ๋๋ฌ์ด ๋์์ ์ํด UI ์ค๋ ๋์์ ์ฒ๋ฆฌ๋๋๋ก ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ฌ์ ์ ๊ฐ๋ฅํ ์์ฑ์ ๋จผ์ ํ์ ์์ค์์ ๋ ธ์ถ๋์ด์ผ ํฉ๋๋ค. 1809 ์ด์ ๋ฒ์ ์ Win10์ ๊ฒฝ์ฐ UI ์ค๋ ๋์์ ์ ์ด ํ๋ก์ธ์ค ๋ง์ฐ์ค ํ ์ ๋ ฅ์ ํฌํจํ๋ ๋ ผ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
์ฌ์ ์ ๊ฐ๋ฅํ ์์ฑ์ ๋ ธ์ถํ๊ณ ๋ช ์์ ์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ UI ์ค๋ ๋์์ ์ ์ด ํ๋ก์ธ์ค ๋ง์ฐ์ค ํ ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋์ฒดํ๋ ๋์์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ฑ์ด ํ์ ์์ค์ ์๋ ๊ฒฝ์ฐ ํด๋น ์์ฑ์ ์์กดํ๊ณ ์ด๋ฅผ ํฉ์ฑ๊ธฐ๋ก ๋๋๋ฆฌ๋ ๊ฒ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. ์คํฌ๋กค์ ์๋ง๋ ๋ง์ฐ์ค ํ ๋งํผ ๋ถ๋๋ฝ์ง ์์ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ ๊ด์ฐฎ์๊น์?
๋ฐ๋ผ์ ํ์ฌ ํ๋/์ถ์ ๋์์ ์ฌ์ ์ํ ๋ฐฉ๋ฒ ์์ด InteractionTracker์ ์ ์ฉ๋ฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ์ด์ ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นจ๋จ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝํ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค ๐ค cc @likuba
InteractionTracker์ ์ฌ๊ธฐ์ ๋์์ด ๋ ์ ์๋ ๋ช ๊ฐ์ง ์ต์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค ๐. ํนํ, ์ด๋ฌํ ์ ํ์ ์ฌ์ฉ์ ์ ์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ PointerWheelConfig ๋ฐ DeltaScaleModifier ์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋๊ธฐํํ๊ณ ์ปจํธ๋กค ๋ด์์ ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ์ธ๊ธํ ๋ฌธ์ /์ํ ์์ด ์ฌ๊ธฐ์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ ์ ์๋์ง ํ์ธํ ๊ฒ์ ๋๋ค.
@micahl ๋ด๊ฐ ์์
ํ๊ณ ์๋ ํ๋ก์ ํธ์ ๋ํ ํฅ๋ฏธ๋ก์ด ์ํฉ์ด ์๊ณ PoC์ ๋ํ ๋ด
10000x5000 ํฌ๊ธฐ์ ๊ฑฐ๋ํ ์บ๋ฒ์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์บ๋ฒ์ค ์ฃผ์๋ฅผ ์ด๋ํ๋ ค๋ฉด ์คํฌ๋กค ๋ทฐ์ด์ ์บก์ํํด์ผ ํฉ๋๋ค.
์ด์ ์บ๋ฒ์ค์ 2๊ฐ์ InkCanvases(๋๋ ๊ทธ ์ด์)๊ฐ ์๊ณ ๋ค๋ฅธ ์๊ฐ๋ฝ์ผ๋ก ๋๋ 1๊ฐ์ ์๊ฐ๋ฝ๊ณผ 1๊ฐ์ ๋ง์ฐ์ค ํฌ์ธํฐ๋ก ๋ ๋ค(๋๋ ๊ทธ ์ด์)์ ์ฐ๊ณ ์ถ์ต๋๋ค. ์ด ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ๋ฌ์ฑํ ์ ์์ต๋๊น(๋๋ ๊ฐ๋ฅํฉ๋๊น)? :)
๋ด๊ฐ ๋ณธ ๊ธฐ๋ณธ ๋์์ ํ๋์ InkCanvas์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๋์ ๋ค๋ฅธ ๊ฒ์ ํฐ์นํ์๋ง์ ํน์ InkCanvas๊ฐ "PointerLost"๋ฅผ ์คํํ๊ณ ๊ทธ๊ฒ ์ ๋ถ์
๋๋ค. ๋ค๋ฅธ ํ ์ผ์ด ์์ต๋๋ค.
๋ถ๋ช
ํ ๋ด scrollviewer๋ ๋ด๊ฐ ์ง์ ์์ฑํ ๊ฒ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ด ์ด ์ปจํธ๋กค๋ก ๊ฐ๋ฅํ ์ ์๋์ง ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค !
์๋ ํ์ธ์ @stefangavrilasengage , ํฅ๋ฏธ๋ก์ด ์๋๋ฆฌ์ค์ ๋๋ค. :) PoC์์ ์๊ฐ๋ฝ์ด InkCanvas์ ๋ด๋ ค๊ฐ ๋ค์ ์์ง์ด๊ธฐ ์์ํ ๋ ์์๋๋ ๋์์ ๋ฌด์์ ๋๊น? ๊ทธ๋ฆฌ๊ฑฐ๋ ํฌํฉ๋๊น?
์๋
ํ์ธ์ @micahl - ๋ต์ฅํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ์ง๊ธ์ฏค์ด๋ฉด ๋์งํธ ํ์ดํธ๋ณด๋ ์ฑ๊ณผ ๋น์ทํ๋ค๊ณ ์ง์ํ์
จ์ ๊ฒ์
๋๋ค.
์ด์ ๋๋ ํ์ฌ ์ผ์ด๋๋ ์ผ์ ์ ์ํ ๊ฒ์
๋๋ค:
๋์์ด ๋๋์? :)
๊ณ ๋ง์ต๋๋ค !
@stefangavrilasengage ๋จ์ผ ํฐ์น ์ ์ค์ฒ๊ฐ ํฌ(ScrollViewer์ ๊ธฐ๋ณธ ๋์)์ธ์ง ์ํฌ๋ฅผ ๊ทธ๋ฆฌ๋์ง ์ฌ๋ถ๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ฌป๊ณ ์์์ต๋๋ค. ๊ฑฐ๊ธฐ์๋ ๋ณธ์ง์ ์ธ ๊ฐ๋ฑ์ด ์์ต๋๋ค. ์ด๋ป๊ฒ ํด๊ฒฐํฉ๋๊น? ์ง๋์ฒ๋ผ ์คํฌ๋กคํ๋ ค๋ฉด ๋ ์๊ฐ๋ฝ์ด ํ์ํฉ๋๊น? ํธ์ง ๋ฒํผ์ ์ฌ์ฉํ์ฌ ํธ์ง ๋ชจ๋์ ๋ค์ด๊ฐ๊ฑฐ๋ ๋๊ฐ์๊ฒ ์ต๋๊น? ๋ฑ...
@micahl ๋ด ์ฌ๊ณผ - ๋ด๊ฐ ์ด๋ป๊ฒ ์ถฉ๋์ ํด๊ฒฐํ๋์ง ์ธ๊ธํ๋ ๊ฒ์ ์์์ต๋๋ค.
์บ๋ฒ์ค์ ์๋ ๊ฐ์ฒด๋ Win2D ์ปจํ
์ด๋ ๋ด๋ถ์ ์ํฌ๊ฐ ์์ต๋๋ค. ๊ฐ ๊ฐ์ฒด์ ๋ํ ํธ์ง ๋ชจ๋๋ฅผ ์
๋ ฅํ๋ ๊ฒฝ์ฐ์๋ง ํธ์ง์ ์ํด InkCanvas๊ฐ ๋งจ ์์ ํ์๋ฉ๋๋ค(์ฌ์ฉ์ ์ ์ ๊ฑด์กฐ ์ฌ์ฉ).
๋ฐ๋ผ์ ๋ด ์ํฉ์์(๋ค๋ฅธ ์ฌ๋์๊ฒ ์ ์ฉ๋๋์ง ํ์คํ์ง ์์) InkCanvas์ "drawable"์ด ํ์ฑํ๋์ด ์์ผ๋ฉด ์๋ฌด ๊ฒ๋ ScrollViewer๋ก ์ด๋ํ์ง ์์์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ์ ์ฉ๋์ง ์๋๋ค๊ณ ์๊ฐํ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฌ ํด์ !
@micahl ๊ณผ ๋ด๊ฐ github ๋ฌธ์ ์์ ์์ธ ๊ฒ์ ์ด๋ฒ์ด ์ฒ์์ด๋ผ๊ณ ๋ฏฟ๊ธฐ
@micahl ๊ณผ ๋ด๊ฐ github ๋ฌธ์ ์์ ์์ธ ๊ฒ์ ์ด๋ฒ์ด ์ฒ์์ด๋ผ๊ณ ๋ฏฟ๊ธฐ
๋ฏธ์ํฉ๋๋ค ! ์์ ๋จ!
@micahgodbolt ๋ง์ง๋ง์ด ์๋ ์๋ ์์ต๋๋ค. ;)
@stefangavrilasengage ๊ฐ์ฌํฉ๋๋ค! ๋ด ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์
๋๋ค. ์ฌ๋ฌ InkCanvas ์ปจํธ๋กค์ด ํฌํจ๋ Canvas์ ๋ถ๋ชจ๋ก Border์ ๊ฐ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ScrollViewer๋ฅผ ๊ต์ฒดํด๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ฐ๋ผ์ ScrollViewer ๋ด์์ ๋ฐ์ํ ๋ ๋ค์ค ์
๋ ฅ/๋ค์ค InkCanvas ๊ธฐ๋ฅ์ด ๊ณ ์ฅ๋๋ ์์ธ์ด ๋ฌด์์ธ์ง ์ดํดํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ผ๋ถ ์ฌ๋๋ค์๊ฒ ์ฐ๋ฝํ์ต๋๋ค.
@stefangavrilasengage , ์๋ํ์ง ์๋ ์ด์ ๋ฅผ ํ์ ํ๋ ๋ฐ ์๊ฐ/์กฐ์ฌ๊ฐ ํ์ํฉ๋๋ค. ์ด ์ ์๊ณผ ๋ณ๋๋ก ์ถ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ด โโ๊ฒ์ธ๊ฐ?
@micahl OnControlLoaded์์ ๋ด ์ฝํ ์ธ ๋ฅผ ์คํฌ๋กคํ๊ณ ํ๋ํ๋ฉด ์๋ชป๋ ์์น์ ์ด ์ฝ๋๋ก .
์ฌ์ฉํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค, @adriantetar! ์ด ์ค๋ ๋๋ฅผ ์ ์์ ์ง์คํ๋๋ก ํฉ์๋ค. ๋ณด๊ณ ์๋ ๋ด์ฉ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๊น? ํด๋น ํ ๋ก ์์ ์ป์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ ์์ ๋ํ ๋ณ๊ฒฝ์ด ์ ๋นํ์ง ๋ ผ์ํ๊ธฐ ์ํด ์ด ์ค๋ ๋๋ก ๋์๊ฐ ์ ์์ต๋๋ค.
@micahl ์ ExtentChanged/StateChanged/ViewChanged ์ด๋ฒคํธ์ ๊ฐ์ฒด๊ฐ ์ธ์๋ก ํฌํจ๋๊ณ State ๋ฉค๋ฒ๊ฐ ์๋ StateChangedEventArgs๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? InteractionTracker๊ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ์คํ๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ์ ์ด ์์ฑ์ ์ฟผ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ๋ฉ์์ง ์ ๋ฌ ํจํด(์ธ์๊ฐ ์๋ ์ด๋ฒคํธ)์ด ์ ํธ๋์ง ์์ต๋๊น?
https://github.com/XeorgeXeorge/Extended-Image-Viewer
ํฐ ๋ฌธ์ ๋ ์๋์ง๋ง ์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ์ํ/์์ง ์คํฌ๋กค ๋ง๋๊ฐ ์ ๊ฒจ(๋นํ์ฑํ)๋ ๊ฒฝ์ฐ์๋ ํ๋/์ถ์๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ ์ฝ๊ฒ ๋งํ๋ฉด:
์ ๊ฐ์ ๋ก ๋ง์ถ๋ฉด์ ํ๋๋ ์ฝํ
์ธ ๋ฅผ ํจ๋ํ ์ ์์ต๋๋ค.
ํจ๊ณผ์ ์ธ ์์ง/์ํ ๋ทฐํฌํธ.
์ด๊ฒ์ ๊ฒ์ํ ๋ ์ค์ ๋ก ๊ธฐ๋ฅ์ ์ธ ํ๋/์ถ์ ์์ ์ ์ป์ผ๋ ค๋ฉด ScrollViewer์์ HorizontalScrollbarVisibility ์์ฑ์ ํ์ฑํํด์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ง๋ง ํจ๊ป ์คํฌ๋ฉํ ์ด์ค ์คํฌ๋กค ๋ทฐ์ด ์๋ฃจ์ ์ผ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ์ถฉ๋ถํ.
@micahl ์ ๋๋ฉ์ด์
์ด ์๋ ํ๋/์ถ์๋ฅผ ์ํํ ๋ Scroller๊ฐ StateChanged ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด์ง ์๋๋ค๋ ๊ฒ์
์ปจํธ๋กค์ด ๋๋ฌด ํฌ๊ฒ ๋์คํฐํ๋์ง ์๋๋ก https://github.com/microsoft/microsoft-ui-xaml/issues/541#issuecomment -488749469์์ ์ ์ํ ๋๋ก Scroller๊ฐ ์ ํด ์ํ๊ฐ ๋ ๋ CanvasVirtualControl ํฌ๊ธฐ ์กฐ์ ์ ์ค์ ํฉ๋๋ค. ํ๋/์ถ์ ๋น์จ์ ๊ธฐ์ค์ผ๋ก ํ ์บ๋ฒ์ค์ ์ผ๋ถ์
๋๋ค. ๊ทธ๋ฌ๋ ์ ๋๋ฉ์ด์
์ด ์๋ ํ๋/์ถ์๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋/์ถ์ ๋ณ๊ฒฝ์ด ์คํ๋์ง ์์๋๋ผ๋ ZoomTo ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ด๋ฅผ ์ํํด์ผ ํฉ๋๋ค(afaict).
@adrientetar , ํ๋ ์์ํฌ์ ์ฑ ๊ฐ์ ์๋ค๋ก ์ ๋ฌํ ์ด๋ฒคํธ ์ธ์๋ฅผ ๋ง๋๋ ๋ฐ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ์ด๋ฒคํธ arg๋ ๋ณด๋ธ ์ฌ๋์ด ๋ ธ์ถํ ์์ฑ์ ๋ณต์ฌ๋ณธ๋ง ์ ๊ณตํ๋ฏ๋ก ํ์ฌ ๋์์ธ์ ์ด๋ฒคํธ arg๋ฅผ ๊ฐ์ง ์๋ ๊ฒ์ ๋๋ค.
์, ํ์ฌ ๋์์ธ์ ์ ๋๋ฉ์ด์ ์ด ์๋ ํ๋/์ถ์์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํธ์ถํ๋ฉด StateChanged๊ฐ ์คํ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ZoomCompleted ๋ฐ ScrollCompleted ์ด๋ฒคํธ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ๋ณ๊ฒฝ์ ๋ํ ์๋ต์ผ๋ก ๋ฐ์ํฉ๋๋ค. IIRC ์ฌ์ฉ์์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ํธ๋ฆฌ๊ฑฐ๋์ง ์์ต๋๋ค. StateChanged์ ํจ๊ป ๊ทธ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก ViewChanged ์ด๋ฒคํธ๋ ๋ณด๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฐ์ํฉ๋๋ค(์ฌ์ฉ์ ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์). ์ด๋ ๋งค์ฐ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ค๋ ๊ฒ์ด ์๋๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ ํ ํผ๋๋ฐฑ์ ๊ท๋ฅผ ๊ธฐ์ธ์ด๊ณ ์์ผ๋ฏ๋ก ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ฌํญ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
์, ํ์ฌ ๋์์ธ์ ์ ๋๋ฉ์ด์ ์ด ์๋ ํ๋/์ถ์์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํธ์ถํ๋ฉด StateChanged๊ฐ ์คํ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ ์์์ด, ์ด์ ์ดํดํ์ด. ์ด๋ฒคํธ๊ฐ ํญ์ ๋ฐ์ํ๊ณ SetFocus์ ๊ฐ์ ์๋ณธ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ ์ ์์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ ๋ฐ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ ์ ์์ต๋๋ค.
ZoomCompleted ๋ฐ ScrollCompleted ์ด๋ฒคํธ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ๋ณ๊ฒฝ์ ๋ํ ์๋ต์ผ๋ก ๋ฐ์ํฉ๋๋ค. IIRC ์ฌ์ฉ์์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ํธ๋ฆฌ๊ฑฐ๋์ง ์์ต๋๋ค.
์ข์, ๋ด ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ZoomCompleted ๋ฐ StateChanged iff State == Idle์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ด์ํ์ง ์์? ๋ด ๋ง์, ๊ฐ์ ๊ฒ์ ๋ํด ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ง ๋ค๋ฅธ ์ด๋ฒคํธ๋ฅผ ๊ฐ๋ ๊ฒ์ ๋จ์ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ด๋ฐ๋์์ ๋ฟ์ ๋๋ค ๐ค
@RBrid ์ ์ ๋ "์ ํ ์ค"์ด๋ผ๋ ์๋ก์ด ์ํ๋ฅผ ๋์ ํ๊ณ ์ฝ๊ฐ์ ์ด๋ฆ์ ๋๋ด ์ต๋๋ค. ์ด๊ฒ์ด ๊ทํ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ ์ ํฉํ์ง ์๋ ค์ฃผ์ญ์์ค.
๋ ผ์๋ ์์ด๋์ด๋ ์คํฌ๋กค/ํ๋/์ถ์ ์์น์ ๋ํ ๋ณ๊ฒฝ์ด ๊ณง ์๋น์ค๋ ๋(์ฌ์ฉ์๊ฐ ์์ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก๋ ) StateChanged ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ณ ํ์ฌ ์ํ๋ฅผ ์ ํ ์ค์ผ๋ก ๋ณด๊ณ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ค์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์คํฌ๋กค(์ ๋๋ฉ์ด์ ๋ฐ ์ ๋๋ฉ์ด์ ์๋)์ ์ํ์ค ๋ชจ์์ ๋๋ค.
// ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์์ฒญ, ์ ๋๋ฉ์ด์
myScrollInfo = ScrollTo(100, ์ ๋๋ฉ์ดํธ=true);
// ๋ช ํฑ
StateChanged ๋ฐ์(Scroller.State == ์ ํ ์ค)
// ๋ช ํฑ
StateChanged ๋ฐ์(Scroller.State == ์ ๋๋ฉ์ด์
)
// ๋ง์ ํฑ
StateChanged ๋ฐ์(Scroller.State == ์ ํด ์ํ)
// ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์์ฒญ, ์ ๋๋ฉ์ด์
์์
myScrollInfo = ScrollTo(100, ์ ๋๋ฉ์ดํธ=๊ฑฐ์ง);
// ๋ช ํฑ
StateChanged ๋ฐ์(Scroller.State == ์ ํ ์ค)
// ๋ช ํฑ
StateChanged ๋ฐ์(Scroller.State == ์ ํด ์ํ)
InteractionState ์ด๊ฑฐํ์ ์ํธ ์์ฉ ์ด์์ ๊ฒ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ScrollState์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
enum ScrollState
{
Idling = 0,
Transitioning = 1,
Interacting = 2,
Inertial = 3,
Animating = 4,
};
@micahl ๋ค, ์ ๊ฐ ์์ํ ๊ฒ๊ณผ ๋งค์ฐ ํก์ฌํฉ๋๋ค! ์ ๋๋ฉ์ด์ ๋ณ๊ฒฝ ์ฌํญ๋ง ์ฒ๋ฆฌํ๋ ค๋ ์ฌ๋์ Animating ์ํ๋ฅผ ๊ฐ๋ก์ฑ ์ ์์ต๋๋ค. ์ด๋ฆ์ ๊ฒฝ์ฐ ์ ํด ์ํ๊ฐ ์๋ ์ ํด ์ํ๋ก ์ ์งํฉ๋๋ค("์คํฌ๋กค๋ฌ๊ฐ ์ ํด ์ํ์ ๋๋ค."/"์คํฌ๋กค์ด ์์ง์ด๊ณ ์์ต๋๋ค."), ์ ํ ์ค โ ๊ต๋ฐ ์ค? (์ ํ์ด ๋งค์ฐ ํผ๋์ค๋ฝ์ต๋๋ค. ๋ชจ์ ์ด ์์๋ ๋์ด๋ฏ๋ก ๊ต๋ฐ ์ด ๋ ์ ์๋ ํ ์ ์์์ ์ ๋ฌํ๊ณ ์ถ์ต๋๋ค. ), ๊ด์ฑ์ ํ๋ฅํ ์ ์์ต๋๋ค ๐ ํ์ง๋ง API ๊ฒํ ๋ ํจ๊ป ์๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ์ด์ฃผ๋ฉด ์ฒ์์๋ ๋ธ๋ ๋ฉ์ ์๊ฐํ๊ฒ ๋์์ต๋๋ค. :) API ๊ฒํ ๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฆ์ ํ์ ํ๊ณ ์ ๋ก๋ฅผ ์ฐพ๋ ๊ฒฝํฅ์ด ์์ ๋ ๊ฐ์ค์น๋ฅผ ์ฃผ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ํญ์ ๋ช ๊ฐ์ง ์ต์ ์ด ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค๋ฅธ ๋์์ ์ ์ ์์ ๋๋ ๋ณด๋ฅ ์ค์ผ ์ ์์ต๋๋ค. Idle๊ณผ ํจ๊ป ๋ API ๋ชจ๋์ ๋ํ ๊ธฐ์กด API์ ์ ๋ก๊ฐ ์์ต๋๋ค. ์ฆ, Idle์ ์ํํ์ง ์์ ๊ฒ์ ๋๋ค.
์ฟจ์ฟจ. ๋ณด๋ฅ ์ค์ธ sgtm, imo Unknown์ Transitioning๋ณด๋ค ํจ์ฌ ๋ ํผ๋์ค๋ฝ์ต๋๋ค.
@micahl -- ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ ๋ฒํธ 3์๋ ๋ค์ ํ์ ํญ๋ชฉ์ด ํฌํจ๋ฉ๋๋ค.
ํจ๊ณผ์ ์ธ ๋ทฐํฌํธ ๋ณ๊ฒฝ์ ์ฐธ์ฌ(ํ์)
ํด๋น ํ์ ํฌ์ธํธ๋ ๊ธฐ์กด ์ด๋ฒคํธ FrameworkElement.EffectiveViewportChanged
ํฉ๋๋ค. ์ฝํ
์ธ ์ ๋น๋๊ธฐ ์ฃผ๋ฌธํ ๋ถ๋ถ ๋ก๋ ๋ ์๊ตฌ ์ฌํญ/์ฐ์ ์์๋ผ๊ณ (๊ฐ์ ์ ์ผ๋ก) ๋งํ ์ ์๋ ํ์ ์์ ์ด ์ถฉ๋ถํฉ๋๊น? ์๋ฅผ ๋ค์ด, MS Edge๊ฐ PDF ๋ฌธ์(๋๋ SVG ๋๋ ๊ธฐํ ๋ณต์กํ ๋ฌธ์)์ ํ๋๋ ํ์ด์ง๋ฅผ ํ์ํ ๋ ScrollViewer๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ๋์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ๋/์ถ์๊ฐ 900%์ธ ๊ฒฝ์ฐ ๋ค์ ๋ ๊ฐ์ง ์ด์ ๋ก ์ธํด ์ ์ฒด PDF ํ์ด์ง๋ฅผ 900% ํฌ๊ธฐ๋ก ๋ฏธ๋ฆฌ ๋ ๋๋งํ์ง ์์ต๋๋ค.
MS Edge๋ ํ๋๋ PDF ํ์ด์ง์ ์ผ๋ถ๋ฅผ ์ฃผ๋ฌธํ์ผ๋ก ๋ ๋๋งํฉ๋๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ํด๋น ๋ถ๋ถ์ ๋ณด๊ธฐ๋ก ์คํฌ๋กคํ ๋๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๊ธฐ์ ์ ํ์ด์ง๊ฐ ํ์๋๊ธฐ ์ ์ ๊ธด ์ง์ฐ์ ๋ฐฉ์งํฉ๋๋ค. ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ์์ ์ด ์๋๋ฆฌ์ค๋ฅผ ๋ช
์์ ์ผ๋ก ์ธ๊ธํ์ง๋ง async Task
๋ํ ๊ฐ์ ์ ์ธ ์ง์๋ ์ ์ํฉ๋๋ค. ๋ ๋๋ง๋์ง ์์(๋๋ ์ฆ์ ์ฌ์ฉํ ์ ์๋) ๋ถ๋ถ์ด ๋ณด๊ธฐ๋ก ์คํฌ๋กค๋๋ฉด ScrollViewer๋ ์ผ์์ ์ผ๋ก ํด๋น ๊ณต๊ฐ์ ๊ตฌ์ฑ ๊ฐ๋ฅํ Brush
๋ก ์ฑ์ด ๋ค์ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ผ๋ฉฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ async Task
์์ํ ์ ์์ต๋๋ค. ๋ถํ์ ๋ ๋๋ง(๋๋ ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฒ์/๋ก๋)ํฉ๋๋ค. ๋์ค์ Task
์๋ฃ๋๋ฉด ๋ ๋๋ง/๊ฒ์/๋ก๋๋ ๋ถ๋ถ์ด ScrollViewer์ ํ์๋์ด Brush
์์๋ก ์ฑ์์ง ๊ณต๊ฐ์ ๋ฎ์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๋์ ์ค์์ ๋์ ๋ ๋๋ง ๋น์ฉ์ ๊ดํ ๊ฒ๋ง์ด ์๋๋๋ค. ์์ฒญ ์ ๊ฒ์๋๋ ์ฝํ ์ธ ์๋ ์ ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ScrollViewer์ ํ์๋ ์ง๋ ๋๋ ์์ฑ ์ด๋ฏธ์ง๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ง๋์ ์ผ๋ถ๋ ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ๋ก ์คํฌ๋กคํ ๋๋ง ์๋ฒ์์ ๋ค์ด๋ก๋๋ฉ๋๋ค.
ํ๋/์ถ์ ๊ด๋ จ API๋ฅผ ํ์๋ ์ปจํธ๋กค(์: ZoomViewer)๋ก ๋ถ๋ฆฌํ์ฌ ScrollViewer๊ฐ ์คํฌ๋กค์ ๋ํด ์๊ฒฉํ๊ฒ ์ ์ฉ๋๋๋ก ํด์ผ ํฉ๋๊น?
ScrollViewer.ZoomFactor
์ ์ถ๊ฐ์ ๋ํด ๋งค์ฐ ๊ฐ์ฌํ์ง๋ง ScrollViewer์ ์ง์ ์ถ๊ฐ๋ ๊ฒ์ ๋ณด๊ณ ๋๋์ต๋๋ค. ์ค์ ๋ณ๋์ ํด๋์ค(๋ฐ๋์ ํ์ ํด๋์ค๋ ์๋)์ ๋ฃ๋ ๊ฒ์ด ๋ ๊ฐ๋จํ๊ณ ์์ ์ ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ต์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
ZoomViewer
ํ์ง ์์ ์์ต๋๋ค ScrollViewer
ํ์ง๋ง, ์ฌ์ฉ ScrollViewer
์์ ์์๋ก ์ธ์คํด์ค๋ฅผ (๋
ControlTemplate
).ZoomableScrollViewer
์์ ์์ต๋๋ค ScrollViewer
.ScrollViewer
๋ด์์ ์ง์ ํ๋/์ถ์๋ฅผ ์ง์ํฉ๋๋ค.17 ๋ง์ฐ์ค ๊ฐ์ด๋ฐ ํด๋ฆญ๊ณผ ์คํฌ๋กค์ ์ง์ํ๋ ๊ธฐ๋ณธ UX๋ฅผ ์ ๊ณตํฉ๋๋ค. (ํด์ผํ๋ค)
18 ๋ง์ฐ์ค๋ฅผ ํตํ ํด๋ฆญ ๋ฐ ์ด๋ ๋ชจ๋ ์ง์(์: PDF ๋ทฐ์ด ๋ด์์ ์ฝํ ์ธ ์ด๋). (ํด์ผํ๋ค)
18์ด 17๋ณด๋ค ํจ์ฌ ์ ์๋ํ๊ณ ์ค์ ๋ก 17์ ์ฌ์ฉํ๋ ์ฌ๋์ ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ 17์ ๋ํ ์ง์์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ถ๋ช
ํ ๋๋ โโ17์ด ์๋ํ ์๋ฏธ๊ฐ ์๋ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค(17์ ๋ํ ์ค๋ช
์ ํ ๋ฌธ์ฅ์ ๋ถ๊ณผํ๋ฉฐ ๋ด๊ฐ ์๊ฐํ๋ ์๋ฏธ๋ฅผ 100% ํ์ ํ์ง ๋ชปํฉ๋๋ค). 18์ ๋งค์ฐ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋ฐ๋ฉด, 17์ ๋ชจ๋๊ฐ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์์ ์ฌ์ฉํ์ง ์๋ ์ด์ํ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์ณ์ง ์์ต๋๊น?
(์ด ๋ฌธ์ ๋ ์ ๊ทผ์ฑ์ ์ํด 17์ด ํ์ํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋์ง๋ง ์ง๊ธ๊น์ง 17์ด ์ ๊ทผ์ฑ ๋ฌธ์ ๋ผ๊ณ ๋งํ๋ ์ฌ๋์ ๋ณธ ์ ์ด ์์ต๋๋ค.)
4 ์ ๋ ฅ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ์ํํ ์ ์์ต๋๋ค.
4๋ฒ์ ์ ๊ทผ์ฑ ๊ด๋ จ ๋ฌธ์ ์ ๋๋ค. ScrollViewer(๋ฐ WinUI์ ๋ค๋ฅธ ๋ชจ๋ ์ปจํธ๋กค)๊ฐ ์ ๊ทผ์ฑ ์ค์ ์ ์กด์คํ๋๋ก ์์ฒญํ๊ณ ์ถ์ต๋๋ค.
Windows 10 -> ์์ -> ์ค์ -> ์ ๊ทผ์ฑ -> ๋์คํ๋ ์ด -> Windows์์ ์ ๋๋ฉ์ด์ ํ์(์ผ๊ธฐ ๋๋ ๋๊ธฐ).
๋ถํํ๋ ์ง๋ ๋ช ๋ ๋์ Microsoft ์ฑ์ด Windows ์ ๊ทผ์ฑ ์ค์ ์ ๋ฌด์ํ๋ ๋ง์ ์๋ฅผ ํ์ธํ์ต๋๋ค. ์ ๋๋ฉ์ด์ ์ ๊บผ์ ธ ์์ง๋ง Microsoft ์ฑ์ ์ด์จ๋ ์ ๋๋ฉ์ด์ ์ ํ์ํฉ๋๋ค. ์ด๊ฒ์ ์ด๋ฌํ ์ ๊ทผ์ฑ ์ค์ ์ ์์กดํ๋ ์ฌ์ฉ์์๊ฒ ์ค์ง์ ์ธ ์ด๋ ค์์ ์ผ๊ธฐํฉ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ๋ถ์ ์ ์ธ ๋ถ์์ฉ ์์ด ์ ๋๋ฉ์ด์ ์ ์ฆ๊ธธ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ์ ๋๋ฉ์ด์ ๋ฑ์ ๋ณด๋ ๋ฐ ์ด๋ ค์์ด ์๋ ์ฌ์ฉ์๋ Windows์์ ์ ๊ทผ์ฑ ์ค์ ์ ์ค์์ฑ์ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
@verelpode ๋ , @predavid ๊ฐ ์๋ก์ด ScrollViewer์ ๋ํ ์์ ์ ๊ฒ์ด๋ฏ๋ก ๊ทธ๋ ์๊ฒ ๋งก๊ธฐ ๊ฒ ์ต๋๋ค.
17 ๋ง์ฐ์ค ๊ฐ์ด๋ฐ ํด๋ฆญ๊ณผ ์คํฌ๋กค์ ์ง์ํ๋ ๊ธฐ๋ณธ UX๋ฅผ ์ ๊ณตํฉ๋๋ค. (ํด์ผํ๋ค)
18 ๋ง์ฐ์ค๋ฅผ ํตํ ํด๋ฆญ ๋ฐ ์ด๋ ๋ชจ๋ ์ง์(์: PDF ๋ทฐ์ด ๋ด์์ ์ฝํ ์ธ ์ด๋). (ํด์ผํ๋ค)18์ด 17๋ณด๋ค ํจ์ฌ ์ ์๋ํ๊ณ ์ค์ ๋ก 17์ ์ฌ์ฉํ๋ ์ฌ๋์ ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ 17์ ๋ํ ์ง์์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ถ๋ช ํ ๋๋ โโ17์ด ์๋ํ ์๋ฏธ๊ฐ ์๋ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค(17์ ๋ํ ์ค๋ช ์ ํ ๋ฌธ์ฅ์ ๋ถ๊ณผํ๋ฉฐ ๋ด๊ฐ ์๊ฐํ๋ ์๋ฏธ๋ฅผ 100% ํ์ ํ์ง ๋ชปํฉ๋๋ค). 18์ ๋งค์ฐ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋ฐ๋ฉด, 17์ ๋ชจ๋๊ฐ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์์ ์ฌ์ฉํ์ง ์๋ ์ด์ํ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์ณ์ง ์์ต๋๊น?
(์ด ๋ฌธ์ ๋ ์ ๊ทผ์ฑ์ ์ํด 17์ด ํ์ํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋์ง๋ง ์ง๊ธ๊น์ง 17์ด ์ ๊ทผ์ฑ ๋ฌธ์ ๋ผ๊ณ ๋งํ๋ ์ฌ๋์ ๋ณธ ์ ์ด ์์ต๋๋ค.)
@verelpode 17์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉฐ 18์ด 17๋ณด๋ค ๋ ์ค์ํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ง๊ด์ ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ "์ผ์ชฝ ํด๋ฆญ ๋ฐ ๋๊ธฐ"๊ฐ ์ ํ ๋๋ ๋์ด์ ๋๊ธฐ์ ๊ฐ์ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ์ด๋ฏธ ์ฌ์ฉ๋๋ ์๋๋ฆฌ์ค๊ฐ ์์ ์ ์์ต๋๋ค. . ์ด๋ฌํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ์ฑ์ด ๊ฐ์ด๋ฐ ํด๋ฆญ(17)์ ํตํด ์คํฌ๋กค์ ํ์ฑํํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋๋๋ก ๋ธ๋ผ์ฐ์ ์์ ์ค๊ฐ ํด๋ฆญ ์คํฌ๋กค์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ์ผ์ชฝ ํด๋ฆญ + ๋๋๊ทธ๋ ํ ์คํธ ์ ํ ๋๋ ์ด๋ฏธ์ง์ ๋๋๊ทธ + ๋๋กญ์ ์ ๋ฐํฉ๋๋ค. UWP ๋ธ๋ผ์ฐ์ ์๋ 18๊ฐ๊ฐ ๋นํ์ฑํ๋๊ณ 17๊ฐ๊ฐ ํ์ฑํ๋ฉ๋๋ค. ๋ ๋ค ๋ณ๋์ ์์ฑ์ ํตํด ์ ํํด์ผ ํฉ๋๋ค.
@lukasf
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋๋๋ก ๋ธ๋ผ์ฐ์ ์์ ์ค๊ฐ ํด๋ฆญ ์คํฌ๋กค์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ์ผ์ชฝ ํด๋ฆญ + ๋๋๊ทธ๋ ํ ์คํธ ์ ํ ๋๋ ์ด๋ฏธ์ง์ ๋๋๊ทธ + ๋๋กญ์ ์ ๋ฐํฉ๋๋ค.
์ข์ ์ ์ ํ ์คํธ ์ ํ ๋ฑ์ด ์๋์ ๋ฉ์ถ๊ฒ ํ๋ ๊ฒ์ ํผํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ์ด์ํ 17 ๋ชจ๋๋ฅผ ์์ํ๋ ๋์ ๋ง์ฐ์ค ๊ฐ์ด๋ฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ง์ฐ์ค ๊ธฐ๋ฐ ํจ๋ ๋ชจ๋(18)๋ฅผ ์์ํ๋๋ก ํฉ๋๋ค.
๋ค๋ฅธ ์ฑ์ด ํ๋ ์ผ์ ๋ณผ ๋ ์ผ๋ถ ์ฑ์์๋ ์คํฌ๋กค ๊ฐ๋ฅํ ์ฝํ ์ธ ์์ญ์ ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ์ผ๋ก ํด๋ฆญํ๋ ๋์ ์คํ์ด์ค๋ฐ ํค๋ฅผ ๋๋ฅธ ์ํ์์ ๋ง์ฐ์ค ๊ธฐ๋ฐ ํจ๋์ ์์ํ ์ ์์ต๋๋ค. ์ด ์๋ฃจ์ ์ ์ฌ์ฉํ๋ฉด ํจ๋ ๋ชจ๋๊ฐ ์คํ์ด์ค๋ฐ+ํด๋ฆญ์ ํตํด์๋ง ์์๋๊ธฐ ๋๋ฌธ์ ์คํฌ๋กค ๊ฐ๋ฅํ ์ฝํ ์ธ ์์ญ ๋ด์์ ์ผ์ชฝ ํด๋ฆญ์ด ์ ์์ ์ผ๋ก ์๋ํ ์ ์์ต๋๋ค. ์คํ์ด์ค๋ฐ+ํด๋ฆญ์ ํตํ ํจ๋์ ๋งค์ฐ ํธ์ํ๊ณ ํธ๋ฆฌํ๊ณ ๋น ๋ฆ ๋๋ค.
๊ทธ๋ฌ๋ ์ด ์คํ์ด์ค๋ฐ+ํด๋ฆญ ์๋ฃจ์ ์ ์คํฌ๋กค ๊ฐ๋ฅํ ์ฝํ ์ธ ์์ญ ๋ด์ ํธ์ง ๊ฐ๋ฅํ ํ ์คํธ ์์๋ฅผ ํ์ํ ํ์๊ฐ ์๋ ์ฑ์์ ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ์คํฌ๋กค ๊ฐ๋ฅํ ์ฝํ ์ธ ์์ญ์ ํธ์ง ๊ฐ๋ฅํ ํ ์คํธ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ํจ๋ ๊ธฐ๋ฅ์ผ๋ก ์ธํด ์ฌ์ฉ์๊ฐ ํ ์คํธ ์์์ ๊ณต๋ฐฑ์ ์ ๋ ฅํ ์ ์๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ง์ํ์ ๋๋ก ์ด ๊ธฐ๋ฅ์ ์์ฑ์ ํตํด ์ ํํด์ผ ํฉ๋๋ค. ๋๋ ์คํ์ด์ค๋ฐ๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ ๋ง์ฐ์ค ๊ฐ์ด๋ฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ง์ฐ์ค ๊ธฐ๋ฐ ํจ๋ ๋ชจ๋(18)๋ฅผ ์์ํ๋๋ก ํ๋ฉด ์ฌ์ฉ์๊ฐ ํ ์คํธ ์์์ ๊ณต๋ฐฑ์ ์ ๋ ฅํ ์ ์๋ ๋ฌธ์ ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
@verelpode
๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ ๋ชจ๋ 17์ ์ง์ํ๋ ๋ง์ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ(Word, Adobe Reader, Outlook ๋ฑ)์ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ ์ด๊ฒ์ด ๊ตฌํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น์ ์ด ๊ฐ์ธ์ ์ผ๋ก ์ด์ํ๋ค๊ณ ๋๋๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ ์ฉํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๋ฌผ๋ก ๋ ๋ชจ๋ ๋ชจ๋ ์ตํธ์ธํด์ผ ํ๋ฉฐ ๊ฐ๋ฐ์๋ ์ฑ์์ ์ฌ์ฉํ ํญ๋ชฉ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฑ์ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ ์คํ์ด์ค๋ฐ+ํด๋ฆญ ๋์๋ ํ์ฉ๋ฉ๋๋ค.
@lukasf -- ์ข์์, ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ํจ๋ ๋ชจ๋(18)๊ฐ ํ ์คํธ ์ ํ ๋๋ ์ด๋ฏธ์ง์ ๋๋๊ทธ+๋๋กญ ๋ฑ์ ๋ฐฉ์งํ์ง ๋ชปํ๋ค๋ฉด ๋ชจ๋ 17 ์ฌ์ฉ์ ์ค์งํ๊ณ 18๋ก ์ ํํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ด์ ๋ ๋ชจ๋ ๋ชจ๋์ ๋ํ ๊ธฐ๋ณธ ์ค์ ์ด ์ค์ ๋ก ์ง์๋ฉ๋๋ค.
@verelpode ๋ฐ @lukasf ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ถ๊ทน์ ์ผ๋ก Scroller ์ปจํธ๋กค์ ๊ณต๊ฐ ๋ ธ๋ธ๊ฐ 17๋ฒ๊ณผ 18๋ฒ์ ์ผ๊ณ ๋ ์ ์๊ธฐ๋ฅผ ์ํ๋ค๋ ์ ์ ๋์ํฉ๋๋ค. 17=๋ง์ฐ์ค ๊ธฐ๋ฐ ์ผ์ ์๋ ํจ๋ ๋ฐ 18=๋ง์ฐ์ค ๊ธฐ๋ฐ ํจ๋.
๋ฐฉ๊ธ ๋ด๊ฐ ํ ์กฐ์ฌ ์์ ์ ์ถ๊ฐํ๊ธฐ ์ํด PR https://github.com/microsoft/microsoft-ui-xaml/pull/1472 ๋ฅผ ๋ณด๋์ต๋๋ค. ์ค๋์ Scroller๋ฅผ ์ฌ์ฉํ์ฌ 17๊ณผ 18์ ๋ชจ๋ ์ง์ํ๋ ๋ฐ ์ผ๋ง๋ ๊ทผ์ ํ ์ ์๋์ง ๋ณด๊ณ ์ถ์์ต๋๋ค.
์๋ฃจ์ ์ ํฐ์น ๊ธฐ๋ฐ ๋๋ ๋ง์ฐ์ค ํ ๊ธฐ๋ฐ ํ๊ฒฝ๊ณผ ๋ฌ๋ฆฌ 100% UI ์ค๋ ๋ ๊ธฐ๋ฐ์ด์ง๋ง 18=๋ง์ฐ์ค ๊ธฐ๋ฐ ํจ๋์์๋ ๋ชจ๋ ๊ฒ์ด ์ ์งํ๋์์ต๋๋ค. ๋ง์ฐ์ค์ PointerMoved ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ ๋์ ScrollTo ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ InteractionTracker ๊ตฌ์ฑ ์์๊ฐ ์๊ฐ๋ฝ ์์ง์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ง์ฐ์ค ์์ง์์ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
17=๋ง์ฐ์ค ๊ธฐ๋ฐ ์ผ์ ์๋ ํจ๋(๋ด๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์ซ์ดํ๋ ๊ฒฝํ)์ ๊ฒฝ์ฐ ์ํฉ์ด ํจ์ฌ ๋ ๊น๋ค๋กญ์ต๋๋ค. ํ๋กํ ํ์ ์ ์ด์์ ์ด์ง ์์ผ๋ฉฐ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ์ง๋ ์์์ง๋ง ํนํ ๋ค์ ๋ ๊ฐ์ง๊ฐ ๊ด๋ จ๋์ด ์์ต๋๋ค.
@RBrid
์ํฉ์ 18=๋ง์ฐ์ค ๊ธฐ๋ฐ ํจ๋์ ๋ํด ๊ฝค ์ ์งํ๋์์ต๋๋ค.
17=๋ง์ฐ์ค ๊ธฐ๋ฐ ์ผ์ ์๋ ํจ๋(๋ด๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์ซ์ดํ๋ ๊ฒฝํ)์ ๊ฒฝ์ฐ ์ํฉ์ด ํจ์ฌ ๋ ๊น๋ค๋กญ์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ๊ฒฐ๊ณผ! ์ด ๊ฒฝ์ฐ 17=constant-velocity์ ์ด๋ ค์์ ๊ณ ๋ คํ๊ณ 18์ด ์ผ์ชฝ ํด๋ฆญ์ ์ ์์ ์ธ ์ฌ์ฉ์ ๋ฐฉํดํ์ง ์๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ผ๋ก๋ ์ ์์ด ๋ค์์ผ๋ก ์ ๋ฐ์ดํธ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ 17์ ํฌ๊ธฐํ๊ณ 18์ ์ง์ํ์ง๋ง 17=constant-velocity๊ฐ ํฌ๊ธฐ๋๋ฉด ์ผ๋ง๋ ๋ง์ ์ฌ์ฉ์๊ฐ ๋ถํํ ์ง ๋ชจ๋ฆ ๋๋ค.
์ด๋ฌํ ์กฐ์ฌ์ ๋ํด @RBrid ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ชจ๋ 18์ด ์ด๋ฏธ ์๋ํ๋ค๋ ์์์ ๋ฃ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค! UI ์ค๋ ๋ ๋ก๋ ์ค์๋ ์ํํ ์๋์ ํ์ฉํ๋ ค๋ฉด InteractionTracker์์ ์ด์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
@verelpode ๋ ๋ชจ๋ ๋ชจ๋ "Should"๋ก ์ค์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ 17์ ์คํํ๊ธฐ์๋ ๋ ธ๋ ฅ์ด ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ ์๋ตํ ์ ์์ต๋๋ค(ํ์ํ ๊ฒฝ์ฐ ๋์ค์ ์ถ๊ฐํ ์ ์์). ๊ทธ๋ฌ๋ ๋๊ตฐ๊ฐ๋ ๋๋ฌด ๋ง์ ๋ณ๊ฒฝ ์์ด ๊ทธ๊ฒ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
์๋ก์ด ScrollViewer์ "Ctrl" ํค๋ฅผ ์ฌ์ฉํ์ฌ ํ๋/์ถ์๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ข์์. 3๊ฐ์ง ์ํฉ์ ์ผ๋์ ๋์์ต๋๋ค.
ํ์์ ์๋๋ฆฌ์ค๋ ๊ฒฝํ์ ํฌํ๊ธฐ ์ํด ๋ง์ฐ์คํ ํด๋ฆญ๊ณผ ๊ฐ์ ๊ฒ์ผ ์ ์์ต๋๋ค. ํด๋ฆญํ์ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ปค์์ ์์น์ ๋ฐ๋ผ ํ์ฌ ์์น(๋ฌด์์ด๋ ๊ฐ์)์์ ์ผ๋ถ ๊ด์ฑ์ด ์ฝ์ ๋ฉ๋๋ค.