2013-05-01 8 views
8

나는 this question을보고 매우 이상한 것을 발견했습니다 : 행의 높이가 Grid.RowSpan과 관련된 일부 경우에 잘못 계산 된 것처럼 보입니다.왜이 여분의 공간이 Grid에 나타 납니까?

<Grid ShowGridLines="True"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <StackPanel Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Background="Red"> 
     <Label Content="CELL 1 A"/> 
     <Label Content="CELL 1 B"/> 
     <Label Content="CELL 1 C"/> 
    </StackPanel> 

    <Grid Grid.Column="0" Grid.Row="2" Background="CornflowerBlue"> 
     <Label Content="CELL 2 D"/> 
    </Grid> 

    <StackPanel Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" Background="Yellow"> 
     <Label Content="CELL 3 A"/> 
     <Label Content="CELL 3 B"/> 
     <Label Content="CELL 3 C"/> 
     <Label Content="CELL 3 D"/> 
    </StackPanel> 


    <Grid Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Background="Green"> 
     <Label Content="CELL 4"/> 
    </Grid> 
</Grid> 

최종 결과는 높이가 여기

 
--------------- 
| 1 |  | 
--------| 3 | 
| 2 |  | 
--------------- 
|  4  | 
--------------- 

그리고 문제를 보여주는이 그리드에 대한 몇 가지 예제 코드 것 :

여기에 내가 함께 테스트있어 Grid의 간단한 도면입니다 세 번째 행 (셀 # 2 및 # 3)의 여백 공간이 많습니다.

enter image description here

첫 번째 셀과 세 번째 셀의 Grid.RowSpan을 +/- 1로 조정하고 여분의 행을 고려하여 +/- 1에 의해 두 번째 및 네 번째에 대해 Grid.Row을 조정하면이 올바른 결과가 나타납니다.

이상하게

enter image description here

과를 일부 제거 :이처럼, 그래서 하나의 행으로 렌더링 할 수있는 세포 # 3에서 충분한 요소를 제거하는 경우

enter image description here

또한 올바른 결과를 얻을 수 개체는 여분의 공간의 오메는

enter image description here

나는 세포의 요소 # 1, # 3, 행 번호의 숫자로 장난 봤는데

적용되고,하지만 난 알아낼 수없는 것 이 행동을 설명하는 결정적인 패턴.

셀 # 3의 Grid.RowSpan을 추가 할 때이 그리드를 렌더링 할 때 장면 뒤에서 WPF는 정확히 무엇을 수행합니까?

+0

격자가 다르게 측정하기 때문에 말하려고했으나 모든 스택 패널을 사용하여 시도했지만 그 행의 크기가 여전히 잘못되었습니다. – Paparazzi

+0

'자동'행 높이가 너무 많습니다. Grid 컨트롤은 행과 열의 스패닝을 처리하는 데 꽤 좋은 역할을하지만 행 높이가 모두 'Auto'로 설정되면 너무 많은 미지수가있는 방정식을 푸는 것과 같습니다. 위쪽 또는 아래쪽 두 행을 고정 된 높이로 제한하면 대단히 도움이됩니다. – Stewbob

+0

@Stewbob 또한 'Height = "*"'에 마지막 행을 남기고 테스트 했으므로 차이가 없습니다. 문제는'RowSpan'을 사용하는 셀의 높이를 결정할 때 발생하며'Grid'가 여분의 수직 공간을 어떻게 할당하는지와 관련이 없습니다. – Rachel

답변

0

.NET에서 세 번째 행이 잘못된 이유에 대한 완전한 대답이 없습니다.
그러나 나는 그것이 0,0 스패닝 2 행을 가질 이유가 없기 때문에 비합법적이라고 요구하는 것을 주장합니다.
행을 공유 할 때 길이가 같지 않을 수 있으며 WPF는 길이가 더 짧아야합니다.
공유 행에 행을 공유 했으므로 WPF가 일부 가중치를 적용해야하며 올바르게 수행하지 않아야합니다.
0 0을 스팬하지 않으면 행 0 열 0 행 1 열 0과 동일한 여분의 공백을 똑같이 (나에게) 정답으로 사용합니다.

<Window x:Class="GridRowSizing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style BasedOn="{StaticResource {x:Type Label}}" TargetType="Label"> 
      <Setter Property="BorderBrush" Value="Black"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="Margin" Value="3"/> 
     </Style> 
    </Window.Resources> 
    <Grid ShowGridLines="True"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <StackPanel Grid.Column="0" Grid.Row="0" Background="Red"> 
      <Label Content="CELL 1 A"/> 
      <Label Content="CELL 1 B"/> 
      <Label Content="CELL 1 C" BorderBrush="Black" BorderThickness="2"/> 
     </StackPanel> 
     <StackPanel Grid.Column="0" Grid.Row="1" Background="CornflowerBlue"> 
      <Label Content="CELL 2 D" BorderBrush="Black" BorderThickness="2"/> 
      <Label Content="CELL 2 E" BorderBrush="Black" BorderThickness="2"/> 
     </StackPanel> 
     <StackPanel Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Background="Yellow"> 
      <Label Content="CELL 3 A"/> 
      <Label Content="CELL 3 B"/> 
      <Label Content="CELL 3 C"/> 
      <Label Content="CELL 3 D" BorderBrush="Black" BorderThickness="2"/> 
      <Label Content="CELL 3 E" BorderBrush="Black" BorderThickness="2"/> 
      <Label Content="CELL 3 F" BorderBrush="Black" BorderThickness="2"/> 
     </StackPanel> 
     <StackPanel Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Background="Green"> 
      <Label Content="CELL 4"/> 
     </StackPanel> 
    </Grid> 
</Window> 
+0

그래, 그런 코드는 비논리적이며 불필요하고 정의되지 않은 두 번째 행 (Grid.Row = "1")을 제거하는 등의 동작을 피하는 쉬운 방법이 있음을 알고 있지만 WPF가 처음부터 그런 식으로 렌더링을 결정하고 특정 RowSpans에서만 렌더링을 결정합니다. WPF가 정의되지 않은 행을 측정 할 때 일부 가중치를 잘못 적용하고 있다고 생각합니다. 요소의 수는 추가 공간을 얼마나 많이 가져 오는지에 영향을줍니다. 나는 이것에 대해 확실한 답을 얻기 위해 반사체를 꺼낼 필요가 있다고 생각한다. ... – Rachel

+1

나는 그것이 가중치가 잘못되었다고 생각한다. (그러나 그것이 무게를내는 것을 볼 수있는 유효한 이유가 없다). 올바른 가중치가 나타나는 것을 볼 때 델타가 0이고 잘못된 가중치가 0 인 것으로 의심되면 잘못된 답을 볼 수 없습니다. – Paparazzi

1

은 내가 마이크로 소프트 직원에게서 얻은 응답 당 여분의 공간 appearing in a ListView

에 대해 my question here에로, 이전 상태의이 종류로 실행했습니다

이 버그는 단계를 포함한다 VSP의 측정 알고리즘에서 발견 된 가장 큰 크기를 기억하고 미래의 모든 측정 호출이 최소 크기만큼의 크기를보고하도록합니다. 귀하의 경우 VSP는 모든 트리거가 시작되기 전에 먼저 측정되므로 모든 것이 보이는 것처럼 크기가 계산됩니다.트리거가 발사하고 단추를 접을 때 측정 알고리즘은 올바른 (작은) 크기를 계산하지만 결과를 다시 크게 만듭니다.

그리드의 동작은 내 가상화 스택 패널의 동작과 유사하게 나타납니다 뭔가 기억하고 항상 더 큰 크기를보고 그것을 강제로 RowDefinition의 측정 호출을 진행하더라도 나중에 아래로하지만 줄이 작을수록 좋습니다.

간단히 말해 WPF에서 버그가 발견되었습니다. WPF에서는 버그를 발견했습니다. 즉, 필요한 총계에 대해 정의 된 총 행 수와 일치하는 수많은 해결 방법이 있으므로 눈금을 다시 정렬하십시오. Microsoft Connect 버그를 열고 답장을 기다리는 것만으로이를 확인하거나 반박 할 수 있습니다.

+2

링크 된 게시물은 매우 흥미 롭습니다. 측정 값 호출의 버그에 대해 당신이 맞다고 생각합니다. 걱정하지 마시고, 링크 된 게시물의 상대 견적을 포함시키기 위해 답을 약간 편집하겠습니다. 리플렉터 나 MSDN 코드로 백업 할 수 있도록 뒷 배경에서 일어나는 일을 정확하게 설명하는 답변을 게시하기를 기대했지만, 그렇게 생각하지는 않아서 현상금이 나올 것이라고 생각하지 않습니다. 당신의 대답은 내가 솔리드 한 대답을 얻는 가장 가까운 것입니다. – Rachel

+0

Rachel 나는 당신이 방금 좋은 편집자의 가치를 증명했다고 생각합니다. 랜덤 하우스, 메모 해! –

0

Rob이 말했듯이 이것은 아마도 WPF 측정 호출의 버그 일 것입니다. 그래서 나는 당신의 대답을 모른다. WPF 앱의 내부 동작을 탐색하기 위해 Snoop을 사용합니다. 그것은 놀라운 도구입니다. HTML 요소를 보여주는 브라우저 도구와 유사하게, snoop은 WPF 양식이 어떻게 배치되는지, 중첩 된 요소, 요소의 속성 등을 보여줍니다. 레이아웃 문제를 파악할 때 많은 도움이됩니다. 나는 내가 말할 것이라고 생각했다.

관련 문제