다음을 통해 공유


2창 보기

두 창 보기는 목록/세부 정보 보기와 같이 2개의 고유한 콘텐츠 영역이 있는 앱의 표시를 관리하는 데 도움이 되는 레이아웃 컨트롤입니다.

올바른 컨트롤인가요?

두 개의 고유하지만 관련된 콘텐츠 영역이 있는 경우 다음 두 개의 창 보기를 사용합니다.

  • 콘텐츠가 자동으로 다시 정렬되고 창에 잘 맞게 크기가 조정되어야 합니다.
  • 여유 공간에 따라 콘텐츠의 보조 영역이 표시되거나 숨겨져야 합니다.

콘텐츠의 두 영역을 표시해야 하지만 두 창 보기에서 제공하는 크기 조정 및 다시 정렬이 필요하지 않은 경우 분할 보기를 대신 사용하는 것이 좋습니다.

탐색 옵션의 경우 탐색 보기를 사용합니다.

작동 방식

나란히 보기에는 콘텐츠가 표시되는 2개의 영역이 있습니다. 창의 여유 공간에 따라 영역의 크기와 배열이 조정됩니다. 가능한 영역 레이아웃은 TwoPaneViewMode 열거에 의해 정의됩니다.

열거형 값 설명
SinglePane PanePriority 속성에 지정된 대로 하나의 창만 표시됩니다.
Wide WideModeConfiguration 속성에 지정된 대로 창이 가로로 표시되거나 단일 창이 표시됩니다.
Tall TallModeConfiguration 속성에 지정된 대로 창이 세로로 표시되거나 단일 창이 표시됩니다.

넓은 모드에서 두 창 보기 앱, 왼쪽에 산의 사진이 있고 오른쪽에 사진에 대한 정보가 있습니다.

와이드 모드의 앱.

두 창 보기 앱이 높은 모드에서, 위쪽에는 산의 사진이 있고 하단에는 사진에 대한 정보가 있습니다.

세로 모드의 앱입니다.

1개 영역만 사용할 수 있는 공간이 있을 때 표시되는 영역을 지정하려면 PanePriority를 설정하여 나란히 보기를 구성합니다. 그런 다음, Pane1을 톨 창의 위쪽 또는 아래쪽에 표시할지, 아니면 와이드 창의 왼쪽 또는 오른쪽에 표시할지를 지정합니다.

영역의 크기와 배열은 나란히 보기에서 자동으로 처리하지만 영역 내부의 콘텐츠는 크기 및 방향 변경에 맞게 사용자가 직접 조정해야 합니다. 적응형 UI를 만드는 방법에 대한 자세한 내용은 XAML을 사용하는 응답성이 뛰어난 레이아웃레이아웃 패널을 참조하세요.

두 창 보기 만들기

이 XAML은 기본 TwoPaneView을 만드는 방법을 보여줍니다.

<TwoPaneView>
    <TwoPaneView.Pane1>
        <Grid Background="{ThemeResource LayerFillColorDefaultBrush}">
            <TextBlock Text="Pane 1" Margin="24"
                       Style="{ThemeResource HeaderTextBlockStyle}"/>
        </Grid>
    </TwoPaneView.Pane1>

    <TwoPaneView.Pane2>
        <Grid Background="{ThemeResource LayerFillColorAltBrush}">
            <TextBlock Text="Pane 2" Margin="24"
                       Style="{ThemeResource HeaderTextBlockStyle}"/>
        </Grid>
    </TwoPaneView.Pane2>
</TwoPaneView>

창이 기본 크기로 설정된 나란히 보기

TwoPaneView는 페이지 레이아웃의 루트 요소가 아니어도 됩니다. 실제로 이는 앱을 전체적으로 탐색하는 데 사용되는 NavigationView 컨트롤 내에서 사용하는 경우가 많습니다. TwoPaneView XAML 트리의 위치에 관계없이 적절하게 조정됩니다.

영역에 콘텐츠 추가

나란히 보기의 각 창에는 단일 XAML UIElement가 포함될 수 있습니다. 콘텐츠를 추가하려면 일반적으로 각 영역에 XAML 레이아웃 패널을 배치한 다음, 다른 컨트롤과 콘텐츠를 패널에 추가합니다. 영역은 크기가 변경될 수 있고 와이드 모드와 톨 모드 간에 전환될 수 있으므로 각 영역의 콘텐츠가 이러한 변경에 맞게 조정될 수 있는지 확인해야 합니다. 적응형 UI를 만드는 방법에 대한 자세한 내용은 XAML을 사용하는 응답성이 뛰어난 레이아웃레이아웃 패널을 참조하세요.

이 예제에서는 이전에 표시된 간단한 그림/정보 앱 UI를 만듭니다. 콘텐츠는 사용 가능한 공간의 양에 따라 두 창에 표시되거나 단일 창으로 결합될 수 있습니다. (한 창에 공간만 있는 경우 Pane2의 콘텐츠를 Pane1로 이동하고 사용자가 스크롤하여 숨겨진 콘텐츠를 볼 수 있도록 합니다. 이에 대한 코드는 나중에 모드 변경에 응답 섹션에서 볼 수 있습니다.)

이중 화면에서 걸쳐 있는 예제 앱의 작은 이미지

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" MinHeight="40"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <CommandBar DefaultLabelPosition="Right">
        <AppBarButton x:Name="Share" Icon="Share" Label="Share" Click="Share_Click"/>
        <AppBarButton x:Name="Print" Icon="Print" Label="Print" Click="Print_Click"/>
    </CommandBar>

    <TwoPaneView
        x:Name="MyTwoPaneView"
        Grid.Row="1"
        MinWideModeWidth="959"
        MinTallModeHeight="863"
        ModeChanged="TwoPaneView_ModeChanged">

        <TwoPaneView.Pane1>
            <Grid x:Name="Pane1Root">
                <ScrollViewer>
                    <StackPanel x:Name="Pane1StackPanel">
                        <Image Source="Assets\LandscapeImage8.jpg"
                               VerticalAlignment="Top" HorizontalAlignment="Center"
                               Margin="16,0"/>
                    </StackPanel>
                </ScrollViewer>
            </Grid>
        </TwoPaneView.Pane1>

        <TwoPaneView.Pane2
            <Grid x:Name="Pane2Root">
                <ScrollViewer x:Name="DetailsContent">
                    <StackPanel Padding="16">
                        <TextBlock Text="Mountain.jpg" MaxLines="1"
                                       Style="{ThemeResource HeaderTextBlockStyle}"/>
                        <TextBlock Text="Date Taken:"
                                       Style="{ThemeResource SubheaderTextBlockStyle}"
                                       Margin="0,24,0,0"/>
                        <TextBlock Text="8/29/2019 9:55am"
                                       Style="{ThemeResource SubtitleTextBlockStyle}"/>
                        <TextBlock Text="Dimensions:"
                                       Style="{ThemeResource SubheaderTextBlockStyle}"
                                       Margin="0,24,0,0"/>
                        <TextBlock Text="800x536"
                                       Style="{ThemeResource SubtitleTextBlockStyle}"/>
                        <TextBlock Text="Resolution:"
                                       Style="{ThemeResource SubheaderTextBlockStyle}"
                                       Margin="0,24,0,0"/>
                        <TextBlock Text="96 dpi"
                                       Style="{ThemeResource SubtitleTextBlockStyle}"/>
                        <TextBlock Text="Description:"
                                       Style="{ThemeResource SubheaderTextBlockStyle}"
                                       Margin="0,24,0,0"/>
                        <TextBlock Text="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna."
                                       Style="{ThemeResource SubtitleTextBlockStyle}"
                                       TextWrapping="Wrap"/>
                    </StackPanel>
                </ScrollViewer>
            </Grid>
        </TwoPaneView.Pane2>
    </TwoPaneView>

    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="TwoPaneViewStates">
            <VisualState x:Name="Normal"/>
            <VisualState x:Name="Wide">
                <VisualState.Setters>
                    <Setter Target="MyTwoPaneView.Pane1Length"
                            Value="2*"/>
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
</Grid>

표시할 영역 지정

나란히 보기가 단일 영역만 표시할 수 있는 경우 PanePriority 속성을 사용하여 표시할 영역을 결정합니다. 기본적으로 PanePriority는 Pane1로 설정됩니다. XAML 또는 코드에서 이 속성을 설정하는 방법은 다음과 같습니다.

<TwoPaneView x:Name="MyTwoPaneView" PanePriority="Pane2">
MyTwoPaneView.PanePriority = TwoPaneViewPriority.Pane2;

영역 크기 조정

창의 크기는 Pane1LengthPane2Length 속성에 의해 결정됩니다. 이는 자동배율(*) 크기 조정을 지원하는 GridLength 값을 사용합니다. 자동 및 배율 크기 조정에 대한 설명은 XAML을 사용하는 응답성이 뛰어난 레이아웃레이아웃 속성 섹션을 참조하세요.

기본적으로 Pane1LengthAuto로 설정되고 해당 콘텐츠에 맞게 크기가 조정됩니다. Pane2Length*로 설정되며, 나머지 공간을 모두 사용합니다.

창이 기본 크기로 설정된 나란히 보기

기본 크기 조정을 사용하는 영역

기본값은 Pane1의 항목 목록 및 Pane2의 많은 세부 정보가 포함되는 일반적인 목록/세부 정보 레이아웃에 유용합니다. 그러나 콘텐츠에 따라 공간을 다르게 나눌 수 있습니다. 여기서 Pane1Length2*로 설정되므로 Pane2보다 두 배 많은 공간을 확보합니다.

<TwoPaneView x:Name="MyTwoPaneView" Pane1Length="2*">

화면의 2/3를 사용하는 창 1과 1/3을 사용하는 창 2가 있는 나란히 보기

크기가 2* 및 *인 영역

자동 크기 조정을 사용하도록 창을 설정하는 경우 창 콘텐츠를 포함하는 높이와 너비 Panel 를 설정하여 크기를 제어할 수 있습니다. 이 경우 이벤트를 처리 ModeChanged 하고 콘텐츠의 높이 및 너비 제약 조건을 현재 모드에 맞게 설정해야 할 수 있습니다.

와이드 또는 톨 모드로 표시

단일 화면에서 나란히 보기의 표시 ModeMinWideModeWidthMinTallModeHeight 속성에 따라 결정됩니다. 두 속성의 기본값은 641px이며 NavigationView.CompactThresholdWidth와 동일합니다.

HeightWidthTwoPaneView의 표시 모드를 결정하는 방식을 이 표에서 보여줍니다.

TwoPaneView 조건 모드
Width > MinWideModeWidth Wide 모드가 사용됨
Width <= MinWideModeWidthHeight>MinTallModeHeight Tall 모드가 사용됨
Width <= MinWideModeWidthHeight<= MinTallModeHeight SinglePane 모드가 사용됨

와이드 구성 옵션

MinWideModeWidth는 나란히 보기가 와이드 모드로 전환되는 경우를 제어합니다. 두 창 보기는 사용 가능한 공간이 Wide 속성보다 넓을 때 MinWideModeWidth 모드로 전환됩니다. 기본값은 641px이지만 원하는 대로 변경할 수 있습니다. 일반적으로 이 속성은 원하는 영역의 최소 너비로 설정해야 합니다.

나란히 보기가 와이드 모드인 경우 WideModeConfiguration 속성에서 표시할 항목을 결정합니다.

열거형 값 설명
SinglePane 단일 창입니다(PanePriority에 따라 결정됨). 창에서 TwoPaneView의 전체 크기를 사용합니다(즉, 두 방향 모두에서 배율 크기 조정됨).
LeftRight Pane1은 왼쪽에 있고, Pane2는 오른쪽에 있습니다. 두 창이 모두 세로로 배율 크기 조정되고, Pane1의 너비는 자동으로 조정되며, Pane2의 너비는 배율 크기 조정됩니다.
RightLeft Pane1은 왼쪽에 있고, Pane2는 오른쪽에 있습니다. 두 창이 모두 세로로 배율 크기 조정되고, Pane2의 너비는 자동으로 조정되며, Pane1의 너비는 배율 크기 조정됩니다.

기본 설정은 LeftRight입니다.

왼쪽오른쪽 오른왼
왼쪽에서 오른쪽으로 구성된 나란히 보기 오른쪽에서 왼쪽으로 구성된 나란히 보기

참고 항목

디바이스가 오른쪽에서 왼쪽으로 읽는 언어를 사용할 때, 두 창 보기는 순서를 자동으로 교체합니다: RightLeftLeftRight로 렌더링되고, LeftRightRightLeft로 렌더링됩니다.

톨 구성 옵션

사용 가능한 공간이 Tall보다 좁고 MinWideModeWidth보다 높으면, 두 창 보기가 MinTallModeHeight 모드로 전환됩니다. 기본값은 641px이지만 원하는 대로 변경할 수 있습니다. 일반적으로 이 속성은 원하는 영역의 최소 높이로 설정해야 합니다.

나란히 보기가 톨 모드인 경우 TallModeConfiguration 속성에서 표시할 항목을 결정합니다.

열거형 값 설명
SinglePane 단일 창입니다(PanePriority에 따라 결정됨). 창에서 TwoPaneView의 전체 크기를 사용합니다(즉, 두 방향 모두에서 배율 크기 조정됨).
TopBottom Pane1은 위쪽에 있고, Pane2는 아래쪽에 있습니다. 두 창이 모두 가로로 배율 크기 조정되고, Pane1의 높이는 자동으로 조정되며, Pane2의 높이는 배율 크기 조정됩니다.
BottomTop Pane1은 아래쪽에 있고, Pane2는 위쪽에 있습니다. 두 창이 모두 가로로 배율 크기 조정되고, Pane2의 높이는 자동으로 조정되며, Pane1의 높이는 배율 크기 조정됩니다.

기본값은 TopBottom입니다.

위아래 아래위
위쪽에서 아래쪽으로 구성된 나란히 보기 아래쪽에서 위쪽으로 구성된 나란히 보기

MinWideModeWidth 및 MinTallModeHeight의 특수 값

이 속성을 사용하여 두 창 보기가 MinWideModeWidth 모드로 전환되지 않도록 하려면, WideMinWideModeWidth로 설정하기만 하면 됩니다.

MinTallModeHeightDouble.PositiveInfinity로 설정하면 두 창 보기가 Tall 모드로 들어가는 것을 방지합니다.

MinTallModeHeight를 0으로 설정하면 나란히 보기가 SinglePane 모드로 전환되지 않습니다.

모드 변경에 대한 응답

읽기 전용 Mode 속성을 사용하여 현재 표시 모드를 가져올 수 있습니다. 나란히 보기에서 표시하는 창을 변경할 때마다 업데이트된 콘텐츠를 렌더링하기 전에 ModeChanged 이벤트가 발생합니다. 이벤트를 처리하여 표시 모드 변경에 응답할 수 있습니다.

중요합니다

페이지가 처음 로드될 때 ModeChanged 이벤트가 발생하지 않으므로 기본 XAML에서 처음 로드될 때 표시되는 UI를 나타내야 합니다.

이 이벤트를 사용할 수 있는 한 가지 방법은 사용자가 SinglePane 모드에서 모든 콘텐츠를 볼 수 있도록 앱의 UI를 업데이트하는 것입니다. 예를 들어 예시 앱에는 기본 영역(이미지) 및 정보 영역이 있습니다.

톨 모드에서 걸쳐 있는 예제 앱의 작은 이미지

Tall 모드

하나의 창을 표시하는 데 충분한 공간만 있는 경우 사용자가 스크롤하여 모든 콘텐츠를 볼 수 있도록 Pane2의 콘텐츠를 Pane1로 이동합니다. 모양은 다음과 같습니다.

모든 콘텐츠를 단일 창에서 스크롤하는 단일 화면의 샘플 앱 이미지

SinglePane 모드

MinWideModeWidthMinTallModeHeight 속성에서 표시 모드를 변경하는 경우를 결정하므로 이러한 속성의 값을 조정하여 콘텐츠를 창 간에 이동하는 경우를 변경할 수 있습니다.

콘텐츠를 ModeChangedPane1 간에 이동하는 Pane2 이벤트 처리기 코드는 다음과 같습니다. 또한 VisualState 를 설정하여 모드에서 Wide 이미지의 너비를 제한합니다.

private void TwoPaneView_ModeChanged(TwoPaneView sender, object args)
{
    // Remove details content from it's parent panel.
    ((Panel)DetailsContent.Parent).Children.Remove(DetailsContent);
    // Set Normal visual state.
    VisualStateManager.GoToState(this, "Normal", true);

    // Single pane
    if (sender.Mode == TwoPaneViewMode.SinglePane)
    {
        // Add the details content to Pane1.
        Pane1StackPanel.Children.Add(DetailsContent);
    }
    // Dual pane.
    else
    {
        // Put details content in Pane2.
        Pane2Root.Children.Add(DetailsContent);

        // If also in Wide mode, set Wide visual state
        // to constrain the width of the image to 2*.
        if (sender.Mode == TwoPaneViewMode.Wide)
        {
            VisualStateManager.GoToState(this, "Wide", true);
        }
    }
}

UWP 및 WinUI 2

중요합니다

이 문서의 정보 및 예제는 Windows 앱 SDKWinUI 3를 사용하는 앱에 최적화되어 있지만 WinUI 2를 사용하는 UWP 앱에도 대체로 적용 가능합니다. 플랫폼별 정보 및 예제는 UWP API 참조를 참조하세요.

이 섹션에는 UWP 또는 WinUI 2 앱에서 컨트롤을 사용하는 데 필요한 정보가 포함되어 있습니다.

UWP 앱용 TwoPaneView 에는 WinUI 2가 필요합니다. 설치 지침을 비롯한 자세한 내용은 WinUI 2를 참조하세요. 이 컨트롤에 대한 API는 Microsoft.UI.Xaml.Controls 네임스페이스에 있습니다.

이 문서의 코드를 WinUI 2와 함께 사용하려면 XAML의 별칭(여기서는 muxc를 사용)을 사용하여 프로젝트에 포함된 Windows UI 라이브러리 API를 표현합니다. 자세한 내용은 WinUI 2 시작을 참조하세요.

xmlns:muxc="using:Microsoft.UI.Xaml.Controls"

<muxc:TwoPaneView />