레이아웃Layout

이 항목에서는 Windows Presentation Foundation (WPF) 레이아웃 시스템에 대해 설명 합니다.This topic describes the Windows Presentation Foundation (WPF) layout system. WPF에서 사용자 인터페이스를 만드는 데는 레이아웃 계산이 발생 하는 방법과 시기를 이해 하는 것이 중요 합니다.Understanding how and when layout calculations occur is essential for creating user interfaces in WPF.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.This topic contains the following sections:

요소 경계 상자Element Bounding Boxes

WPF의 레이아웃을 고려할 때 모든 요소를 둘러싸는 경계 상자를 이해 하는 것이 중요 합니다.When thinking about layout in WPF, it is important to understand the bounding box that surrounds all elements. 레이아웃 FrameworkElement 시스템에서 사용 하는 각는 레이아웃에 슬롯으로 사용 되는 사각형으로 간주할 수 있습니다.Each FrameworkElement consumed by the layout system can be thought of as a rectangle that is slotted into the layout. 클래스 LayoutInformation 는 요소의 레이아웃 할당 또는 슬롯의 경계를 반환 합니다.The LayoutInformation class returns the boundaries of an element's layout allocation, or slot. 사각형의 크기는 사용 가능한 화면 공간, 모든 제약 조건의 크기, 레이아웃 관련 속성 (예: 여백 및 안쪽 여백) 및 부모 Panel 요소의 개별 동작을 계산 하 여 결정 됩니다.The size of the rectangle is determined by calculating the available screen space, the size of any constraints, layout-specific properties (such as margin and padding), and the individual behavior of the parent Panel element. 레이아웃 시스템은이 데이터를 처리 하 여 특정 Panel의 모든 자식 항목의 위치를 계산할 수 있습니다.Processing this data, the layout system is able to calculate the position of all the children of a particular Panel. 부모 요소에 정의 된 크기 조정 특성 (예: Border)은 자식에 영향을 줍니다.It is important to remember that sizing characteristics defined on the parent element, such as a Border, affect its children.

다음 그림에서는 간단한 레이아웃을 보여 줍니다.The following illustration shows a simple layout.

경계 상자를 표시 하지 않는 일반적인 그리드를 표시 하는 스크린샷

다음 XAMLXAML을 사용하여 이 레이아웃을 실현할 수 있습니다.This layout can be achieved by using the following XAMLXAML.

<Grid Name="myGrid" Background="LightSteelBlue" Height="150">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="250"/>
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
    <RowDefinition />
  </Grid.RowDefinitions>
  <TextBlock Name="txt1" Margin="5" FontSize="16" FontFamily="Verdana" Grid.Column="0" Grid.Row="0">Hello World!</TextBlock>
  <Button Click="getLayoutSlot1" Width="125" Height="25" Grid.Column="0" Grid.Row="1">Show Bounding Box</Button>
  <TextBlock Name="txt2" Grid.Column="1" Grid.Row="2"/>
</Grid>

단일 TextBlock 요소는 Grid내에서 호스팅됩니다.A single TextBlock element is hosted within a Grid. 텍스트는 첫 번째 열의 왼쪽 위 모서리로만 채워지며,에 TextBlock 할당 된 공간은 실제로 훨씬 더 큽니다.While the text fills only the upper-left corner of the first column, the allocated space for the TextBlock is actually much larger. 모든 FrameworkElement 의 경계 상자는 메서드를 GetLayoutSlot 사용 하 여 검색할 수 있습니다.The bounding box of any FrameworkElement can be retrieved by using the GetLayoutSlot method. 다음 그림에서는 TextBlock 요소에 대 한 경계 상자를 보여 줍니다.The following illustration shows the bounding box for the TextBlock element.

TextBlock 경계 상자가 현재 표시 되는 것을 보여 주는 스크린샷

노란색 사각형에 표시 된 것 처럼 TextBlock 요소에 할당 된 공간은 실제로 표시 되는 것 보다 훨씬 큽니다.As shown by the yellow rectangle, the allocated space for the TextBlock element is actually much larger than it appears. 추가 요소가에 추가 Grid되 면 추가 된 요소의 형식 및 크기에 따라이 할당을 축소 하거나 확장할 수 있습니다.As additional elements are added to the Grid, this allocation could shrink or expand, depending on the type and size of elements that are added.

TextBlock 레이아웃 슬롯은 메서드를 GetLayoutSlot 사용 하 Path 여으로 변환 됩니다.The layout slot of the TextBlock is translated into a Path by using the GetLayoutSlot method. 이 기술은 요소의 경계 상자를 표시하는 데 유용합니다.This technique can be useful for displaying the bounding box of an element.

private void getLayoutSlot1(object sender, System.Windows.RoutedEventArgs e)
{
    RectangleGeometry myRectangleGeometry = new RectangleGeometry();
    myRectangleGeometry.Rect = LayoutInformation.GetLayoutSlot(txt1);
    Path myPath = new Path();
    myPath.Data = myRectangleGeometry;
    myPath.Stroke = Brushes.LightGoldenrodYellow;
    myPath.StrokeThickness = 5;
    Grid.SetColumn(myPath, 0);
    Grid.SetRow(myPath, 0);
    myGrid.Children.Add(myPath);
    txt2.Text = "LayoutSlot is equal to " + LayoutInformation.GetLayoutSlot(txt1).ToString();
}
Private Sub getLayoutSlot1(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim myRectangleGeometry As New RectangleGeometry
    myRectangleGeometry.Rect = LayoutInformation.GetLayoutSlot(txt1)
    Dim myPath As New Path
    myPath.Data = myRectangleGeometry
    myPath.Stroke = Brushes.LightGoldenrodYellow
    myPath.StrokeThickness = 5
    Grid.SetColumn(myPath, 0)
    Grid.SetRow(myPath, 0)
    myGrid.Children.Add(myPath)
    txt2.Text = "LayoutSlot is equal to " + LayoutInformation.GetLayoutSlot(txt1).ToString()
End Sub

레이아웃 시스템The Layout System

가장 간단한 레이아웃은 재귀 시스템이며 이를 통해 요소의 크기가 조정되고 요소가 배치되고 그려집니다.At its simplest, layout is a recursive system that leads to an element being sized, positioned, and drawn. 구체적으로 말하자면 레이아웃은 Panel Children 요소 컬렉션의 멤버를 측정 하 고 정렬 하는 프로세스를 설명 합니다.More specifically, layout describes the process of measuring and arranging the members of a Panel element's Children collection. 레이아웃은 집약적인 프로세스입니다.Layout is an intensive process. Children 컬렉션이 클수록 수행 해야 하는 계산 횟수가 커집니다.The larger the Children collection, the greater the number of calculations that must be made. 컬렉션을 소유 하는 Panel 요소에 의해 정의 된 레이아웃 동작에 따라 복잡성이 도입 될 수도 있습니다.Complexity can also be introduced based on the layout behavior defined by the Panel element that owns the collection. 와 같이 비교적 Panel간단 Canvas하 게는와 Grid같이 보다 복잡 Panel한 성능을 훨씬 더 향상 시킬 수 있습니다.A relatively simple Panel, such as Canvas, can have significantly better performance than a more complex Panel, such as Grid.

자식 UIElement 에서 해당 위치를 변경할 때마다 레이아웃 시스템에서 새 패스를 트리거할 수 있습니다.Each time that a child UIElement changes its position, it has the potential to trigger a new pass by the layout system. 따라서 불필요한 호출로 인해 애플리케이션 성능이 저하될 수 있으므로 레이아웃 시스템을 호출할 수 있는 이벤트를 이해해야 합니다.Therefore, it is important to understand the events that can invoke the layout system, as unnecessary invocation can lead to poor application performance. 다음에서 레이아웃 시스템이 호출될 때 발생하는 프로세스에 대해 설명합니다.The following describes the process that occurs when the layout system is invoked.

  1. 자식은 UIElement 먼저 핵심 속성을 측정 하 여 레이아웃 프로세스를 시작 합니다.A child UIElement begins the layout process by first having its core properties measured.

  2. FrameworkElement 정의 된 크기 조정 속성 (예 Width:, HeightMargin)이 계산 됩니다.Sizing properties defined on FrameworkElement are evaluated, such as Width, Height, and Margin.

  3. Panel-특정 논리 (예: Dock 방향 또는 스택 Orientation)가 적용 됩니다.Panel-specific logic is applied, such as Dock direction or stacking Orientation.

  4. 모든 자식을 측정한 후에 콘텐츠가 정렬됩니다.Content is arranged after all children have been measured.

  5. Children 컬렉션은 화면에 그려집니다.The Children collection is drawn on the screen.

  6. 추가 Children 가 컬렉션 LayoutTransform 에 추가 되거나 UpdateLayout 가 적용 되거나 메서드가 호출 되 면 프로세스가 다시 호출 됩니다.The process is invoked again if additional Children are added to the collection, a LayoutTransform is applied, or the UpdateLayout method is called.

이 프로세스와 해당 프로세스가 호출되는 방법은 다음 섹션에 자세히 정의되어 있습니다.This process and how it is invoked are defined in more detail in the following sections.

자식 측정 및 정렬Measuring and Arranging Children

레이아웃 시스템은 Children 컬렉션의 각 멤버, 측정 단계 및 정렬 단계에 대해 두 개의 패스를 완료 합니다.The layout system completes two passes for each member of the Children collection, a measure pass and an arrange pass. 각 자식은 Panel 고유한 특정 레이아웃 MeasureOverride 동작 ArrangeOverride 을 수행 하는 자체 및 메서드를 제공 합니다.Each child Panel provides its own MeasureOverride and ArrangeOverride methods to achieve its own specific layout behavior.

측정 단계 중에는 Children 컬렉션의 각 멤버가 평가 됩니다.During the measure pass, each member of the Children collection is evaluated. 이 프로세스는 Measure 메서드를 호출 하 여 시작 됩니다.The process begins with a call to the Measure method. 이 메서드는 부모 Panel 요소의 구현 내에서 호출 되며 레이아웃을 수행 하기 위해 명시적으로 호출할 필요가 없습니다.This method is called within the implementation of the parent Panel element, and does not have to be called explicitly for layout to occur.

먼저의 UIElement 기본 크기 속성 ( Clip 예: 및 Visibility)이 계산 됩니다.First, native size properties of the UIElement are evaluated, such as Clip and Visibility. 그러면에 constraintSize MeasureCore전달 되는 라는 값이 생성 됩니다.This generates a value named constraintSize that is passed to MeasureCore.

그런 다음에 FrameworkElement 정의 된 프레임 워크 속성이 처리 되어의 constraintSize값에 영향을 줍니다.Secondly, framework properties defined on FrameworkElement are processed, which affects the value of constraintSize. 이러한 속성은 UIElement일반적으로 Height, Width Margin ,,등의기본에대한크기조정특성Style을 설명 합니다.These properties generally describe the sizing characteristics of the underlying UIElement, such as its Height, Width, Margin, and Style. 이러한 각 속성은 요소를 표시하는 데 필요한 공간을 변경할 수 있습니다.Each of these properties can change the space that is necessary to display the element. MeasureOverride는를 매개 변수로 constraintSize 사용 하 여 호출 됩니다.MeasureOverride is then called with constraintSize as a parameter.

참고

HeightWidth의속성과 와의 속성 간에는 차이가 있습니다. ActualWidth ActualHeightThere is a difference between the properties of Height and Width and ActualHeight and ActualWidth. 예를 들어 ActualHeight 속성은 다른 높이 입력 및 레이아웃 시스템을 기반으로 하는 계산 된 값입니다.For example, the ActualHeight property is a calculated value based on other height inputs and the layout system. 값은 실제 렌더링 패스를 기준으로 레이아웃 시스템 자체에 의해 설정 되므로 입력 변경의 기준이 되는와 Height같은 속성의 설정 값 보다 약간 지연 될 수 있습니다.The value is set by the layout system itself, based on an actual rendering pass, and may therefore lag slightly behind the set value of properties, such as Height, that are the basis of the input change.

때문에 ActualHeight 은 계산된 된 값 수는 여러 개 있을 수 있습니다 또는 보고 변경 하 여 다양 한 작업의 결과로 레이아웃 시스템에서.Because ActualHeight is a calculated value, you should be aware that there could be multiple or incremental reported changes to it as a result of various operations by the layout system. 레이아웃 시스템은 자식 요소에 필요한 측정 공간, 부모 요소에 의한 제약 조건 등을 계산할 수도 있습니다.The layout system may be calculating required measure space for child elements, constraints by the parent element, and so on.

측정 단계의 궁극적인 목표는 자식에서 DesiredSize MeasureCore 호출 중에 발생 하는을 확인 하는 것입니다.The ultimate goal of the measure pass is for the child to determine its DesiredSize, which occurs during the MeasureCore call. DesiredSize 은에 의해 Measure 저장 되어 콘텐츠 정렬 단계 중에 사용 됩니다.The DesiredSize value is stored by Measure for use during the content arrange pass.

정렬 단계는 Arrange 메서드를 호출 하 여 시작 합니다.The arrange pass begins with a call to the Arrange method. 정렬 단계 중에 부모 Panel 요소는 자식의 범위를 나타내는 사각형을 생성 합니다.During the arrange pass, the parent Panel element generates a rectangle that represents the bounds of the child. 이 값은 처리를 위해 ArrangeCore 메서드에 전달 됩니다.This value is passed to the ArrangeCore method for processing.

메서드 ArrangeCore 는 자식의를 DesiredSize 평가 하 고 요소의 렌더링 된 크기에 영향을 줄 수 있는 추가 여백을 계산 합니다.The ArrangeCore method evaluates the DesiredSize of the child and evaluates any additional margins that may affect the rendered size of the element. ArrangeCoreArrangeOverride arrangeSizePanel 메서드에 매개 변수로 전달 되는를 생성 합니다.ArrangeCore generates an arrangeSize, which is passed to the ArrangeOverride method of the Panel as a parameter. ArrangeOverride자식의을 finalSize 생성 합니다.ArrangeOverride generates the finalSize of the child. 마지막으로 메서드 ArrangeCore 는 여백 및 맞춤과 같은 오프셋 속성에 대 한 최종 평가를 수행 하 고 자식를 해당 레이아웃 슬롯 내에 배치 합니다.Finally, the ArrangeCore method does a final evaluation of offset properties, such as margin and alignment, and puts the child within its layout slot. 자식은 할당된 공간을 모두 채울 필요가 없으며 실제 모두 채우는 경우가 드뭅니다.The child does not have to (and frequently does not) fill the entire allocated space. 그러면 컨트롤이 부모 Panel 에 반환 되 고 레이아웃 프로세스가 완료 됩니다.Control is then returned to the parent Panel and the layout process is complete.

패널 요소 및 사용자 지정 레이아웃 동작Panel Elements and Custom Layout Behaviors

WPF는에서 Panel파생 되는 요소 그룹을 포함 합니다.WPF includes a group of elements that derive from Panel. 이러한 Panel 요소를 사용 하면 복잡 한 여러 레이아웃을 사용할 수 있습니다.These Panel elements enable many complex layouts. 예를 들어 StackPanel 요소를 사용 하 여 스택 요소를 쉽게 달성할 수 있으며,를 Canvas사용 하 여 더 복잡 하 고 사용 가능한 흐름 레이아웃을 사용할 수 있습니다.For example, stacking elements can easily be achieved by using the StackPanel element, while more complex and free flowing layouts are possible by using a Canvas.

다음 표에서는 사용 가능한 레이아웃 Panel 요소를 요약 하 여 보여 줍니다.The following table summarizes the available layout Panel elements.

패널 이름Panel name 설명Description
Canvas Canvas 영역에 상대적인 좌표를 기준으로 자식 요소의 위치를 명시적으로 지정할 수 있는 영역을 정의 합니다.Defines an area within which you can explicitly position child elements by coordinates relative to the Canvas area.
DockPanel 자식 요소를 서로 맞춰 가로 또는 세로로 정렬할 수 있는 영역을 정의합니다.Defines an area within which you can arrange child elements either horizontally or vertically, relative to each other.
Grid 열 및 행으로 구성되는 유연한 모눈 영역을 정의합니다.Defines a flexible grid area that consists of columns and rows.
StackPanel 가로 또는 세로 방향으로 한 줄로 자식 요소를 정렬합니다.Arranges child elements into a single line that can be oriented horizontally or vertically.
VirtualizingPanel 에 대 한 프레임 워크를 제공 Panel 해당 자식 데이터 컬렉션을 가상화 하는 요소입니다.Provides a framework for Panel elements that virtualize their child data collection. 이 클래스는 추상 클래스입니다.This is an abstract class.
WrapPanel 콘텐츠를 컨테이너의 가장자리에서 다음 줄로 나눠 왼쪽에서 오른쪽으로 자식 요소의 위치를 지정합니다.Positions child elements in sequential position from left to right, breaking content to the next line at the edge of the containing box. 이후 정렬은 Orientation 속성의 값에 따라 위쪽에서 아래쪽으로 또는 오른쪽에서 왼쪽으로 순차적으로 발생 합니다.Subsequent ordering occurs sequentially from top to bottom or right to left, depending on the value of the Orientation property.

미리 정의 Panel 된 요소 중 하나를 사용 하 여 가능 하지 않은 레이아웃이 필요한 응용 프로그램의 경우 MeasureOverrideArrangeOverride 메서드를 Panel 상속 하 고 재정의 하 여 사용자 지정 레이아웃 동작을 구현할 수 있습니다.For applications that require a layout that is not possible by using any of the predefined Panel elements, custom layout behaviors can be achieved by inheriting from Panel and overriding the MeasureOverride and ArrangeOverride methods.

레이아웃 성능 고려 사항Layout Performance Considerations

레이아웃은 재귀적인 프로세스입니다.Layout is a recursive process. Children 컬렉션의 각 자식 요소는 레이아웃 시스템을 호출할 때마다 처리 됩니다.Each child element in a Children collection gets processed during each invocation of the layout system. 따라서 필요하지 않을 때 레이아웃 시스템을 트리거하는 것을 피해야 합니다.As a result, triggering the layout system should be avoided when it is not necessary. 다음은 보다 뛰어난 성능을 얻는 데 도움이 되는 고려 사항입니다.The following considerations can help you achieve better performance.

  • 레이아웃 시스템에서 재귀적으로 업데이트하도록 하는 속성 값 변경에 주의해야 합니다.Be aware of which property value changes will force a recursive update by the layout system.

    레이아웃 시스템을 초기화하는 값을 가진 종속성 속성은 공용 플래그로 표시됩니다.Dependency properties whose values can cause the layout system to be initialized are marked with public flags. AffectsMeasureAffectsArrange 는 레이아웃 시스템에서 재귀 업데이트를 적용 하는 속성 값 변경에 대 한 유용한 단서를 제공 합니다.AffectsMeasure and AffectsArrange provide useful clues as to which property value changes will force a recursive update by the layout system. 일반적으로 요소의 경계 상자 크기에 영향을 줄 수 있는 모든 속성은 AffectsMeasure 플래그가 true로 설정 되어야 합니다.In general, any property that can affect the size of an element's bounding box should have a AffectsMeasure flag set to true. 자세한 내용은 종속성 속성 개요를 참조하세요.For more information, see Dependency Properties Overview.

  • 가능 하면 대신 RenderTransform LayoutTransform을 사용 합니다.When possible, use a RenderTransform instead of a LayoutTransform.

    LayoutTransformUI(사용자 인터페이스)user interface (UI)의 콘텐츠에 영향을 주는 매우 유용한 방법일 수 있습니다.A LayoutTransform can be a very useful way to affect the content of a UI(사용자 인터페이스)user interface (UI). 그러나 변환 결과가 다른 요소의 위치에 영향을 주지 않아도 되는 경우이 레이아웃 시스템을 호출 하지 않으므로 RenderTransform RenderTransform 를 대신 사용 하는 것이 가장 좋습니다.However, if the effect of the transform does not have to impact the position of other elements, it is best to use a RenderTransform instead, because RenderTransform does not invoke the layout system. LayoutTransform변환을 적용 하 고 재귀적 레이아웃 업데이트를 적용 하 여 영향을 받는 요소의 새 위치를 고려 합니다.LayoutTransform applies its transformation and forces a recursive layout update to account for the new position of the affected element.

  • 에 대 한 불필요 UpdateLayout한 호출을 방지 합니다.Avoid unnecessary calls to UpdateLayout.

    메서드 UpdateLayout 는 재귀적 레이아웃 업데이트를 강제 적용 하며 반드시 필요한 것은 아닙니다.The UpdateLayout method forces a recursive layout update, and is frequently not necessary. 전체 업데이트가 필요하다고 확신하는 경우를 제외하고는 레이아웃 시스템에서만 이 메서드를 호출합니다.Unless you are sure that a full update is required, rely on the layout system to call this method for you.

  • 많은 Children 컬렉션을 사용 하 여 작업 하는 경우 VirtualizingStackPanel 일반 StackPanel대신를 사용 하는 것이 좋습니다.When working with a large Children collection, consider using a VirtualizingStackPanel instead of a regular StackPanel.

    자식 컬렉션을 가상화 하 여는 VirtualizingStackPanel 현재 부모의 뷰포트 내에 있는 개체만 메모리에 보관 합니다.By virtualizing the child collection, the VirtualizingStackPanel only keeps objects in memory that are currently within the parent's ViewPort. 이를 통해 대부분의 시나리오에서 성능이 크게 향상됩니다.As a result, performance is substantially improved in most scenarios.

하위 픽셀 렌더링 및 레이아웃 반올림Sub-pixel Rendering and Layout Rounding

WPF 그래픽 시스템은 장치 독립적 단위를 사용 하 여 해상도 및 장치 독립성을 사용 하도록 설정 합니다.The WPF graphics system uses device-independent units to enable resolution and device independence. 각 장치 독립적 픽셀은 시스템의 dpi (인치당 도트 수) 설정에 따라 자동으로 크기가 조정 됩니다.Each device independent pixel automatically scales with the system's dots per inch (dpi) setting. 이렇게 하면 WPF 응용 프로그램에서 dpi 설정에 맞게 적절 한 크기 조정을 제공 하 고 응용 프로그램에서 자동으로 dpi를 인식 하도록 합니다.This provides WPF applications proper scaling for different dpi settings and makes the application automatically dpi-aware.

그러나이 dpi 독립성은 앤티앨리어싱으로 인해 불규칙 한 가장자리 렌더링을 만들 수 있습니다.However, this dpi independence can create irregular edge rendering because of anti-aliasing. 일반적으로 흐리거나 반투명한 가장자리로 표시되는 이러한 아티팩트는 가장자리의 위치가 디바이스 픽셀 사이가 아닌 디바이스 픽셀 가운데에 있을 때 발생할 수 있습니다.These artifacts, typically seen as blurry or semi-transparent edges, can occur when the location of an edge falls in the middle of a device pixel instead of between device pixels. 레이아웃 시스템에서는 레이아웃 반올림을 사용하여 조정할 수 있는 방법을 제공합니다.The layout system provides a way to adjust for this with layout rounding. 레이아웃 반올림에서 레이아웃 단계 동안 모든 비정수 픽셀 값을 레이아웃 시스템이 반올림합니다.Layout rounding is where the layout system rounds any non-integral pixel values during the layout pass.

레이아웃 반올림은 기본적으로 사용되지 않습니다.Layout rounding is disabled by default. 레이아웃 반올림을 사용 하려면 UseLayoutRounding 속성을 any FrameworkElementtrue 설정 합니다.To enable layout rounding, set the UseLayoutRounding property to true on any FrameworkElement. 종속성 속성이므로 값이 시각적 트리의 모든 자식에 전파됩니다.Because it is a dependency property, the value will propagate to all the children in the visual tree. 전체 UI에 대해 레이아웃 반올림을 사용 하려면 루트 UseLayoutRounding 컨테이너 true 에서을로 설정 합니다.To enable layout rounding for the entire UI, set UseLayoutRounding to true on the root container. 예제를 보려면 UseLayoutRounding를 참조하십시오.For an example, see UseLayoutRounding.

새로운 기능What's Next

요소의 측정 방법과 정렬 방법을 이해하는 것이 레이아웃을 이해하기 위한 첫 단계입니다.Understanding how elements are measured and arranged is the first step in understanding layout. 사용할 수 있는 Panel 요소에 대 한 자세한 내용은 패널 개요를 참조 하세요.For more information about the available Panel elements, see Panels Overview. 레이아웃에 영향을 줄 수 있는 다양한 배치 속성을 더 잘 이해하려면 맞춤, 여백 및 안쪽 여백 개요를 참조하세요.To better understand the various positioning properties that can affect layout, see Alignment, Margins, and Padding Overview. 간단한 응용 프로그램 에서 모두 함께 사용할 준비가 되 면 연습: 내 첫 번째 WPF 데스크톱응용 프로그램입니다.When you are ready to put it all together in a lightweight application, see Walkthrough: My first WPF desktop application.

참고자료See also