Stackpanel의 아이들이 최대 공간을 아래로 채우도록하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/569095

문제

나는 단순히 왼쪽에 흐르는 텍스트와 오른쪽에 도움말 상자를 원합니다.

헬프 박스는 바닥까지 끝까지 연장되어야합니다.

아래의 외부 스택 패널을 꺼내면 훌륭하게 작동합니다.

그러나 레이아웃의 이유로 (USERCONTROLS를 동적으로 삽입하고 있음) 포장 스택 패널이 필요합니다.

내가 시도한 것처럼 GroupBox가 StackPanel의 맨 아래로 확장되도록하려면 어떻게해야합니까?

  • 수직 정렬 = "스트레치"
  • verticalContentalIngment = "스트레치"
  • 높이 = "자동"

XAML :

<Window x:Class="TestDynamic033.Test3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test3" Height="300" Width="600">
    <StackPanel 
        VerticalAlignment="Stretch" 
        Height="Auto">

        <DockPanel 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch" 
            Height="Auto" 
            Margin="10">

            <GroupBox 
                DockPanel.Dock="Right" 
                Header="Help" 
                Width="100" 
                Background="Beige" 
                VerticalAlignment="Stretch" 
                VerticalContentAlignment="Stretch" 
                Height="Auto">
                <TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap" />
            </GroupBox>

            <StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
                <TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
            </StackPanel>

        </DockPanel>
    </StackPanel>
</Window>

대답:

고마워 Mark, StackPanel 대신 DockPanel을 사용하여 제거했습니다. 일반적으로 WPF 레이아웃을 위해 DockPanel을 점점 더 많이 사용하고 있습니다. 여기에 고정 된 XAML이 있습니다.

<Window x:Class="TestDynamic033.Test3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test3" Height="300" Width="600" MinWidth="500" MinHeight="200">
    <DockPanel 
        VerticalAlignment="Stretch" 
        Height="Auto">

        <DockPanel 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch" 
            Height="Auto" 
            MinWidth="400"
            Margin="10">

            <GroupBox 
                DockPanel.Dock="Right" 
                Header="Help" 
                Width="100" 
                VerticalAlignment="Stretch" 
                VerticalContentAlignment="Stretch" 
                Height="Auto">
                <Border CornerRadius="3" Background="Beige">
                    <TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap" 

                Padding="5"/>
                </Border>
            </GroupBox>

            <StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
                <TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
            </StackPanel>

        </DockPanel>
    </DockPanel>
</Window>
도움이 되었습니까?

해결책

당신이 원하는 것 같네요 StackPanel 최종 요소가 남은 모든 공간을 사용하는 곳. 그러나 왜 사용하지 않는가 DockPanel? 다른 요소를 장식하십시오 DockPanel ~와 함께 DockPanel.Dock="Top", 그런 다음 도움말 제어가 나머지 공간을 채울 수 있습니다.

XAML :

<DockPanel Width="200" Height="200" Background="PowderBlue">
    <TextBlock DockPanel.Dock="Top">Something</TextBlock>
    <TextBlock DockPanel.Dock="Top">Something else</TextBlock>
    <DockPanel
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        Height="Auto" 
        Margin="10">

      <GroupBox 
        DockPanel.Dock="Right" 
        Header="Help" 
        Width="100" 
        Background="Beige" 
        VerticalAlignment="Stretch" 
        VerticalContentAlignment="Stretch" 
        Height="Auto">
        <TextBlock Text="This is the help that is available on the news screen." 
                   TextWrapping="Wrap" />
     </GroupBox>

      <StackPanel DockPanel.Dock="Left" Margin="10" 
           Width="Auto" HorizontalAlignment="Stretch">
          <TextBlock Text="Here is the news that should wrap around." 
                     TextWrapping="Wrap"/>
      </StackPanel>
    </DockPanel>
</DockPanel>

당신이없는 플랫폼에 있다면 DockPanel 사용 가능한 (예 : WindowsStore), 그리드로 동일한 효과를 만들 수 있습니다. 대신 그리드를 사용하여 수행 한 위의 예는 다음과 같습니다.

<Grid Width="200" Height="200" Background="PowderBlue">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0">
        <TextBlock>Something</TextBlock>
        <TextBlock>Something else</TextBlock>
    </StackPanel>
    <Grid Height="Auto" Grid.Row="1" Margin="10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>
        <GroupBox
            Width="100"
            Height="Auto"
            Grid.Column="1"
            Background="Beige"
            Header="Help">
            <TextBlock Text="This is the help that is available on the news screen." 
              TextWrapping="Wrap"/>
        </GroupBox>
        <StackPanel Width="Auto" Margin="10" DockPanel.Dock="Left">
            <TextBlock Text="Here is the news that should wrap around." 
              TextWrapping="Wrap"/>
        </StackPanel>
    </Grid>
</Grid>

다른 팁

이런 일이 일어나고있는 이유는 스택 패널이 모든 어린이 요소를 긍정적 인 무한대로 측정하여 축소 요소라는 축의 제약 조건을 측정하기 때문입니다. 아동 통제는 그들이 얼마나 큰지를 반환해야합니다 (긍정적 인 무한대는 유효한 수익이 아닙니다. geasonEverride 두 축 모두에서) 따라서 모든 것이 맞는 가장 작은 크기를 반환합니다. 그들은 실제로 얼마나 많은 공간을 채워야하는지 알 수있는 방법이 없습니다.

견해에 스크롤 기능이 필요하지 않고 위의 답변이 귀하의 요구에 맞지 않는 경우 자체 패널을 구현하는 것이 좋습니다. 당신은 아마도 Stackpanel에서 바로 파생 될 수 있으며 당신이해야 할 일은 배열 방법이 자식 요소 사이에 나머지 공간을 나누도록 방법 (각각 동일한 양의 추가 공간을 제공). 원소가 원하는 것보다 더 많은 공간이 주어지면 요소가 잘 렌더링되어야하지만, 덜 주면 결함이 나타나기 시작합니다.

모든 것을 스크롤 할 수 있기를 원한다면 스크롤 뷰어가 작업 할 공간이 무한한 양의 공간을 제공하기 때문에 어린이 요소와 동일한 위치에있게되기 때문에 물건이 조금 더 어려울 까봐 두려워합니다. 원래. 이 상황에서는 새 패널에 새 속성을 만들어 뷰포트 크기를 지정할 수 있으므로 ScrollViewer의 크기에이를 바인딩 할 수 있어야합니다. 이상적으로는 당신이 구현할 것입니다 Iscrollinfo, 그러나 모든 것을 제대로 구현하려면 복잡해지기 시작합니다.

대체 방법은 하나의 열이있는 그리드를 사용하고 N 줄. 모든 행 높이를 설정하십시오 Auto, 그리고 바닥에서 가장 높은 행 높이 1*.

그리드가 DockPanel, StackPanel 및 Wrappanel보다 더 나은 레이아웃 성능을 가지고 있음을 발견했기 때문에이 방법을 선호합니다. 그러나 ItemTemplate (많은 수의 항목에 대해 레이아웃이 수행되는 곳)에서 사용하지 않는 한, 아마도 눈치 채지 못할 것입니다.

당신이 사용할 수있는 수정 된 버전 Stackpanel의 :

<st:StackPanel Orientation="Horizontal" MarginBetweenChildren="10" Margin="10">
   <Button Content="Info" HorizontalAlignment="Left" st:StackPanel.Fill="Fill"/>
   <Button Content="Cancel"/>
   <Button Content="Save"/>
</st:StackPanel>

첫 번째 버튼은 채워집니다.

Nuget을 통해 설치할 수 있습니다.

Install-Package SpicyTaco.AutoGrid

나는 또한 살펴 보는 것이 좋습니다 WPF-AUTOGRID. Dockpanel, Stackpanel 및 Grid 대신 WPF의 양식에 매우 유용하며 매우 쉽고 우아하게 스트레칭하는 문제를 해결합니다. github의 readme를보십시오.

<st:AutoGrid Columns="160,*" ChildMargin="3">
    <Label Content="Name:"/>
    <TextBox/>

    <Label Content="E-Mail:"/>
    <TextBox/>

    <Label Content="Comment:"/>
    <TextBox/>
</st:AutoGrid>

당신이 할 수있는 몇 가지 일 :

1 : Orientation 에게 수직의:

<StackPanel Orientation="Vertical"></StackPanel>
  1. 설정 HeightStackPanel 창과 동일하게 :

물론, 당신은 그것들을 결합 할 수 있습니다 속성:

<StackPanel Orientation="Vertical" Height="600"></StackPanel>

너겟을 설치하는 데 필요한 추가 작업을 할 필요는 없습니다 ....

편집하다

ScrollViewer 안에 StackPanel을 배치 할 수도 있습니다. 이를 통해 콘텐츠 가시성을 희생하지 않고 Groupbox의 높이를 제어 할 수 있습니다.

<GroupBox>
    <ScrollViewer>
        <StackPanel Orientation="Vertical>
              <!-- Place Children Objects here-->
        <StackPanel>
    <ScrollViewer>
<GroupBox>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top