2010-01-19 84 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显示我的第三排。

随着网格这似乎有点凌乱,也设置整个行的可见性被折叠。我想我必须通过将行内容的高度设置为零来完成。

是否有更灵活的网格布局。我想到了stackpannel,但不确定是否有多个列并保持行同步。

这可能是一个非常简单的问题,但我有兴趣在我做任何事之前从其他人那里获得输入。

回答

1

我不会推荐控件的高度设置为零 - 一两件事,它仍然是可能的选项卡为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 2010-01-19 15:54:24

+0

如果您不需要编写自己的“系统.Windows.Controls.BooleanToVisibilityConverter”,则也嵌入到框架中 – kenwarner 2010-01-19 20:05:15

+0

不在silverlight – 2010-04-08 19:44:35