如何使两个控件完全相同的高度

时间:2014-05-07 16:51:02

标签: silverlight

希望两个控件占用所有可用空间并且大小完全相同。此外,当更改一个控制可见性为折叠时,我希望另一个控件占用空间。怎么可能?

以下xaml将确保控件具有相同的高度并填充空间。但无论控件的可见性如何,空间都由两行占据。

   <Grid >
        <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
            <TextBlock   Name="t1" Grid.Row="0"   Text="first"  />
            <TextBlock Name="t2" Grid.Row="1"  Text="second" />
        </Grid>

非常感谢任何帮助

3 个答案:

答案 0 :(得分:2)

如果您有少量固定数量的此控件,那么您还可以使用替代解决方案,即将行高度绑定到控件可见性。 为此,我们可以像这样修改您的示例:

<Grid>
    <Grid.Resources>
        <local:VisibilityToRowHeightConverter x:Key="visibilityToRowHeightConverter" />
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding Visibility, ElementName=t1, Converter={StaticResource visibilityToRowHeightConverter}}" />
        <RowDefinition />
    </Grid.RowDefinitions>

    <TextBlock Name="t1" Text="first" />
    <TextBlock Name="t2" Grid.Row="1" Text="second" />
</Grid>

转换器代码:

public class VisibilityToRowHeightConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
     if (value is Visibility)
        return ((Visibility) value) == Visibility.Visible 
            ? new GridLength(1, GridUnitType.Star) 
            : new GridLength(0);

     return value;
  }

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

因此,每次t1崩溃时,相应的RowDefinition会将其值设置为0,并在再次显示t1时返回到一个星标。

答案 1 :(得分:2)

难以使用Silverlight库存面板。考虑实施StretchPanel。 关于SL StretchPanel实施: SO question and answerblog post linked from there

答案 2 :(得分:1)

我无法使用任何内置面板控件来想办法。

一个简单的黑客就是更新每个更新可见性的行定义数量:

int numberOfRows = grid.Children.Count(item => item.Visibility == Visibility.Visible);
grid.RowDefinitions.Clear();
for (int i=0 ; i<numberOfRows ; i++)
    grid.RowDefinitions.Add(new RowDefinition());

这将确保可见的孩子平等分享垂直空间。

更强大的方法是构建自己的Panel控件 - 如果你经常使用这种布局,可能值得付出努力。