2012-08-28 2 views
1

너비가 "Auto", "*", and "Auto" 인 3 개의 열이있는 Silverlight 5.0 Grid가 있습니다. 두 번째 열 안에 폭이 "25*" 인 4 개의 열이있는 다른 Grid가 있습니다. 이 4 개의 열은 각각 ComboBox입니다.Silverlight Grid 열 너비

너비가 모두 동일하게 정의되어 있어도 콤보 상자의 "자동"크기는 자동으로 지정되며 하나를 선택하면 항목의 크기에 맞게 상자 자체가 아래쪽 화살표보다 더 크게 좁혀집니다.

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
<ContentControl Grid.Column="0" FontSize="20" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10,1,0,1"> 
    <ContentPresenter Content="This is a Label" /> 
</ContentControl> 
    <Grid Grid.Column="1" HorizontalAlignment="Center"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="25*"/> 
      <ColumnDefinition Width="25*"/> 
      <ColumnDefinition Width="25*"/> 
      <ColumnDefinition Width="25*"/> 
     </Grid.ColumnDefinitions> 
     <ComboBox Grid.Column="0" Name="comboView" FontSize="14" Margin="2,1,2,1" > 
      <ComboBox.Items> 
       <ComboBoxItem Content="Item1" IsSelected="True" /> 
       <ComboBoxItem Content="Item2" /> 
      </ComboBox.Items> 
     </ComboBox> 
     <ComboBox Grid.Column="1" Name="comboField" FontSize="14" Margin="2,1,2,1" > 
      <ComboBox.Items> 
       <ComboBoxItem Content="Field1" IsSelected="True" /> 
       <ComboBoxItem Content="Field2" /> 
      </ComboBox.Items> 
     </ComboBox> 

...

은 어떻게 놓친? 첫 번째 열이 Auto으로 설정되고 나머지가 Width=9*과 같이 설정된 하나의 표가있는 경우 ComboBoxes는 이러한 방식으로 작동하지 않습니다.

더 자세히 살펴보면, 내부 격자의 HorizontalAlignment="Center"이 원인 인 것처럼 보입니다. 제거하면 콤보 상자가 크기 유지 상태로 돌아 오지만 필요한 외부 공간을 차지한 다음 바깥 쪽 열에 가운데 놓기를 원할 때 전체 외부 1 열을 차지합니다.

+0

'25 *'대신'0.25 *'를 시도하십시오 –

+0

정확히 원하는 것을 파싱하는 데 약간의 문제가 있습니다. 2 개의 콤보 상자를 그리드의 중앙에 배치하고 필요한 공간 만 채우고 싶습니까? – DanTheMan

+0

@DanTheMan - (네 개의 콤보 상자가 있습니다. 실제로 정의를 반복하지 않았습니다.) 원하는 것은 세 개의 열 (레이블, 콤보 상자 세트 및 단추)이고 가운데 열은 네 개의 콤보 상자 . 콤보 상자는 각각 동일한 너비 (Width = "25 *") 여야하며 필요한 공간 만 차지하며 그 중 네 개는 외부 그리드의 가운데 열에 가운데 놓입니다. –

답변

0

정확하게 이해했다면 가장 큰 문제는 모든 콤보 박스가 같은 폭의 공간을 차지하도록 (즉, 모든 크기가 최대 크기의 콤보 박스와 동일한 크기로) 동일한 콤보 상자를 원한다는 것입니다. I 다른 모든 것들을 바로 잡았습니다.

이것은 WPF에서 매우 쉽습니다. 격자 폭을 균등하게 분배하는 'IsSharedSizeScope'이라는 속성이 있습니다.

Silverlight에는 이러한 속성이 없습니다. 이렇게하려면 각각의 크기를 바인드하여 코드에서 수행해야 할 가능성이 큽니다. 약간 해키지만 작동해야합니다. 그들 모두에 대한 이런 식으로 뭔가 : 뒤에 코드에서 다음

<ComboBox Grid.Column="1" Name="comboField" FontSize="14" Margin="2,1,2,1" Width="{Binding Path=Width}" SizeChanged="comboField_SizeChanged"> 

:

GridLength Width = new GridLength(10); 

private void comboField_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    if (e.NewSize.Width > len.Value) 
    { 
     Width = new GridLength(e.NewSize.Width); 
    } 
} 

편집 : 당신이 원하는 같은 일을 할 것으로 보인다 this library도있다.

+0

이것을 보아 주셔서 감사합니다. 'len.Value' 란 무엇입니까? –

+0

문제는 실제로 모든 콤보 박스가 같은 너비가되는 것은 아닙니다. 각 ColumnDefinition Width를 1 *로 설정하여 관리 할 수 ​​있습니다. 실제 문제는 바깥 쪽 그리드 내에서 중심에 놓으려고하는 것입니다. HorizontalAlignment = Center를 내부 Grid에 적용하면, 동작이 일정한 Column Widths에서 가변 폭 (자동 인 경우처럼)으로 변경되고 ComboBox가 선택 될 때 최소 너비로 축소됩니다. 이 동작은 SizeChanged를 처리하거나 처리하지 않고 동일합니다.센터링을 제거하면 모든 콤보 상자의 너비는 일정하지만 모두 함께 바깥 쪽 모눈 열의 모든 공간을 차지합니다. –

+0

현재 해결 방법은 두 개의 열 정의를 추가하는 것입니다. 하나는 콤보 상자 앞에, 다른 하나는 이후에 추가하십시오. 너비를 설정하면 패션 후에 나에게 "센터링"을 할 수 있습니다. 난 단지 시행 착오를 통해 ColumnDefinition 너비를 하드 코딩해야합니다. –