WPF의 표준 컨트롤에 DockStyle.Fill을 사용하는 방법은 무엇입니까?


92

나는 윈도우 폼에서 사용되어 패널을 만들고 그 안에 컨트롤을 배치하고 DockStyle.Fill 하고 주변 패널에 최대 크기를 제공합니다.

WPF에서 나는 똑같은 것을 원합니다. TabControl이 있고 크기가 가능한 한 많은 양식을 채우고 싶습니다. 리본 컨트롤 (RibbonControlsLibrary)이 있고 나머지 양식을 TabControl로 최대 크기로 채우고 싶습니다.

(Visual Studio의 도킹과 같은 컨트롤을 도킹하고 싶지 않습니다. 단지 오래된 도킹 메커니즘)

답변:


181

WinForms의 DockStyle.Fill에 해당하는 WPF는 다음과 같습니다.

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

이것은 거의 컨트롤의 기본값이므로 일반적으로 WPF 컨트롤이 부모 컨테이너를 채우기 위해 아무것도 할 필요가 없습니다 . 자동으로 수행됩니다. 이것은 아이들을 최소 크기로 짜 내지 않는 모든 용기에 해당됩니다.

흔한 실수

이제 HorizontalAlignment="Stretch" VerticalAlignment="Stretch"예상대로 작동 하지 않는 몇 가지 일반적인 실수에 대해 설명하겠습니다 .

1. 명시적인 높이 또는 너비

일반적인 실수 중 하나는 컨트롤의 너비 또는 높이를 명시 적으로 지정하는 것입니다. 따라서 이것이 있다면 :

<Grid>
  <Button Content="Why am I not filling the window?" Width="200" Height="20" />
  ...
</Grid>

너비 및 높이 속성을 제거하십시오.

<Grid>
  <Button Content="Ahhh... problem solved" />
  ...
</Grid>

2. 패널을 포함하면 컨트롤이 최소 크기로 축소됩니다.

또 다른 일반적인 실수는 컨테 이닝 패널이 컨트롤을 최대한 꽉 쥐게하는 것입니다. 예를 들어 수직 StackPanel은 항상 내용물을 최대한 작게 수직으로 압축합니다.

<StackPanel>
  <Button Content="Why am I squished flat?" />
</StackPanel>

다른 패널로 변경하면 좋습니다.

<DockPanel>
  <Button Content="I am no longer squished." />
</DockPanel>

또한 높이가 "자동"인 그리드 행 또는 열은 마찬가지로 해당 방향으로 내용을 압축합니다.

아이들을 짜 내지 않는 용기의 몇 가지 예는 다음과 같습니다.

  • ContentControls는 절대로 자식을 압착하지 않습니다 (여기에는 Border, Button, CheckBox, ScrollViewer 등이 포함됩니다)
  • 단일 행과 열이있는 그리드
  • "*"크기의 행과 열이있는 그리드
  • DockPanel이 마지막 자식을 쥐지 않습니다.
  • TabControl이 콘텐츠를 압축하지 않습니다.

아이들을 짜내는 용기의 몇 가지 예는 다음과 같습니다.

  • StackPanel이 방향 방향으로 압착됩니다.
  • "자동"크기의 행 또는 열이있는 그리드가 해당 방향으로 축소됨
  • DockPanel은 마지막 자식을 제외한 모든 것을 도킹 방향으로 압착합니다.
  • TabControl은 헤더를 압착합니다 (탭에 표시되는 내용).

3. 명시적인 높이 또는 너비

다음과 같이 명시적인 높이와 너비가 지정된 Grid 또는 DockPanel을 몇 번이나 보는지 놀랍습니다.

<Grid Width="200" Height="100">
  <Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>

일반적으로 어떤 패널에도 명시적인 높이 또는 너비를 지정하고 싶지 않습니다. 레이아웃 문제를 진단 할 때의 첫 번째 단계는 찾을 수있는 모든 명시적인 높이 또는 너비를 제거하는 것입니다.

4. 윈도우는 안될 때 SizeToContent입니다.

SizeToContent를 사용하면 콘텐츠가 최소 크기로 압축됩니다. 많은 응용 프로그램에서 이것은 매우 유용하며 올바른 선택입니다. 그러나 콘텐츠에 "기본"크기가 없으면 SizeToContent를 생략 할 수 있습니다.


여기에 상당히 복잡한 새로운 레이아웃 관련 질문을 남겼 습니다 . 여기에서 귀하의 답변을 읽은 후 이해할 수 있다고 생각합니다. Cheers
Berryl 2010

7
훌륭한 대답입니다! 어떻게 든 당신에게 보너스 포인트를 줄 수 있으면 좋겠어요. :)
Jim Raden 2012

@Jim 나전 : 당신은 레이 번스에 포인트를이 질문에 현상금을 추가하고 할당 할 수 있습니다)
citronas

1
향후 독자를위한 참고 사항 : 다시 컴파일 할 때까지 디자인 뷰에서 업데이트되지 않습니다.
David

"<Button Content ="창을 채우지 않는 이유는 무엇입니까? "Width ="200 "Height ="20 "/>"가 나를 부 쉈다! XD
Jack Frost

7

그냥 말하고 DockPanel LastChildFill="True"필러가되고 싶은 것이 실제로 마지막 아이인지 확인함으로써 원하는 것을 할 수 있습니다!

Grid는 대부분의 작업을 수행 할 수있는 레이아웃의 짐승이지만 DockPanel은 일반적으로 가장 바깥 쪽 레이아웃 패널에 적합한 선택입니다. 다음은 의사 코드 예입니다.

<DockPanel LastChildFill="True">
    <MyMenuBar DockPanel.Dock="Top"/>
    <MyStatus DockPanel.Dock="Bottom"/>

    <MyFillingTabControl />
</DockPanel>

5

두 개의 행이있는 그리드로 컨트롤을 감 쌉니다. 그리드는 주어진 모든 공간을 자동으로 사용하며 "*"높이를 지정하여 남은 모든 공간을 차지하도록 행을 정의 할 수 있습니다. 내 예제의 첫 번째 행 (Height = "Auto")은 리본에 필요한만큼의 공간을 차지합니다. 도움이 되었기를 바랍니다.

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

  <Ribbon Grid.Row="0" />

  <TabPage Grid.Row="1" />
</Grid>

"Grid.Row = .."속성을 그리드의 자식 컨트롤에 추가하면 그리드 행에 할당됩니다. 그런 다음 그리드는 행 정의에 정의 된대로 자식의 크기를 조정합니다.


올바른 방향으로 이동합니다. 감사합니다. Grid를 삽입했지만 이제 TabControl에 여전히 사용 가능한 모든 크기를 사용해야한다고 알려야합니까? 어떻게 할 수 있습니까?
citronas 2010

TabControl에 대한 "Grid.Row"속성을 추가하고 해당 행 정의에 "*"높이를 지정해야합니다 (예제에 표시된대로).
andyp

0

여기에서 많은 방법을 시도했지만 문제를 해결할 수 없습니다. (제어에있는 다른 제어 채우기)

내가 찾을 때까지 그것을

<Name_Control Height="auto" Width="auto"/>
//default
//HorizontalAlignment="Stretch" 
//VerticalAlignment="Stretch"

예:

//UserControl:
<UserControl Name="UC_Test" Height="auto" Width="auto" />
//Grid: 
<Grid Name="Grid_test" Grid.ColumnSpan="2" Grid.Row="2" />
//Code: 
Grid_test.Children.Add(UC_Test);

쉬운 디자인을 위해

<UserControl Name="UC_Test" Height="100" Width="100" />
//Code
Grid_test.Children.Add(UC_Test);
UC_Test.Width = Double.NaN;
UC_Test.Height = Double.NaN;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.