希望两个控件占用所有可用空间并且大小完全相同。此外,当更改一个控制可见性为折叠时,我希望另一个控件占用空间。怎么可能?
以下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>
非常感谢任何帮助
答案 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 answer和blog 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控件 - 如果你经常使用这种布局,可能值得付出努力。