2010-01-19 6 views
0

나는 새 컨트롤에 대한 컨트롤을 보유하기 위해 그리드를 사용 해왔다. 이러한; 이 잘 작동Xaml 대신 그리드 레이아웃

<Grid Margin="5"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="150" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <Label Grid.Row="0" Grid.Column="0" Content="Label1:" /> 
     <ListBox Grid.Row="0" Grid.Column="1" />      

     <Label Grid.Row="1" Grid.Column="0" Content="Label2:" /> 
     <ComboBox Grid.Row="1" Grid.Column="1" /> 

     <Label Grid.Row="2" Grid.Column="0" Content="Label3:" /> 
     <TextBox Grid.Row="2" Grid.Column="1" /> 
    </Grid> 

그러나 지금 나는 단지 두 번째 행에있는 콤보 상자에서 selectedvalue에 따라 세 번째 행을 표시 할 상황을 가지고있다.

그리드가 너무 작아서 전체 행의 가시성을 축소시킬 수 없습니다. 행 내용의 높이를 0으로 설정하여이를 수행해야한다고 생각합니다.

그리드보다 유연한 레이아웃이 있습니까? stackpannel에 대해 생각했지만 여러 열을 보유하고 행을 동기화 상태로 유지하는 것에 대해 확신하지 못했습니다.

이것은 아마도 매우 간단한 질문 일 뿐이지 만 나는 무엇보다 먼저 다른 사람들의 의견을 듣고 싶어합니다.

답변

1

I 0으로 컨트롤의 높이를 설정하는 것이 좋습니다 않을 것 - 사용자가 적어도 :)

말에 대한 한 가지, 그것은 여전히 ​​혼란 스러울 것이다 0 높이 제어 탭으로 가능한 것 다른 방법으로, 예를 들어, 콤보 상자의 선택에 영향을받는 컨트롤의 가시성을 결합하려고 :

:

<UserControl xmlns:cnv="clr-namespace:your_namespace_here"> 
<Grid Margin="5"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="150" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Label Grid.Row="0" Grid.Column="0" Content="Label1:" /> 
    <ListBox Grid.Row="0" Grid.Column="1" />      

    <Label Grid.Row="1" Grid.Column="0" Content="Label2:" /> 
    <ComboBox Name="cbo" Grid.Row="1" Grid.Column="1" /> 

    <Label Grid.Row="2" Grid.Column="0" Content="Label3:" 
     Visibility="{Binding ElementName=cbo, Path=SelectedIndex, 
      Converter={cnv:IntToVisibilityConverter}}" /> 
    <TextBox Grid.Row="2" Grid.Column="1" /> 
</Grid> 
코드에서

는 함께 관련 가시성 유형을 반환하는 컨버터를 넣어

namespace your_namespace_here 
{ 
public class IntToVisibilityConverter : MarkupExtension, IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int _value = (int)value; 
     return (_value > 0) ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 
} 

콤보의 첫 번째 항목이 선택되면 변환기는 Visiblity.Collapsed를 반환하고, 그렇지 않으면 Visiblity.Visible을 반환합니다.

테스트되지 않은 코드이지만이 메서드는 소리가납니다. 희망이 좀 사용 중입니다!

+0

나는 당신이 의미하는 것을 봅니다. 말이된다. 대단히 감사합니다! – JTinley

+0

'System.Windows.Controls.BooleanToVisibilityConverter'도 자신 만의 글을 쓸 필요가 없다면 프레임 워크에 내장되어 있습니다. – kenwarner

+0

Silverlight에 포함되어 있지 않습니다. –

관련 문제