Programing

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

lottogame 2020. 9. 11. 19:24
반응형

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


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

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

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


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. Explicit Height or Width further out

It's amazing how many times I see Grid or DockPanel given an explicit height and width, like this:

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

In general you never want to give any Panel an explicit Height or Width. My first step when diagnosing layout problems is to remove every explicit Height or Width I can find.

4. Window is SizeToContent when it shouldn't be

When you use SizeToContent, your content will be squeezed to minimum size. In many applications this is very useful and is the correct choice. But if your content has no "natural" size then you'll probably want to omit SizeToContent.


You can do what you want by just saying DockPanel LastChildFill="True" and then making sure what you want to be the filler is actually the last child!

The Grid is the beast of a layout that you can make do most anything, but the DockPanel is usually the right choice for your outermost layout panel. Here is an psuedocode example:

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

    <MyFillingTabControl />
</DockPanel>

just wrap your controls in a grid with two rows. The grid will automatically use all space given to it and you can define the rows to take up all space left by giving them a height of "*". The first row in my example (Height="Auto") will take as much space as needed by the ribbon. Hope that helps.

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

  <Ribbon Grid.Row="0" />

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

By adding the "Grid.Row=.." attribute to child controls of the grid they get assigned to rows of the grid. Then the grid will size it's children as defined by the row definitions.


I was try many method here but can't solve my problem. (Fill other control in control)

Until i found it

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

Example:

//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);

For easy design

<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;

참고URL : https://stackoverflow.com/questions/3216020/how-to-use-dockstyle-fill-for-standard-controls-in-wpf

반응형