我有一个WPF应用程序在顶层,其布局由3行Grid
。
我想中间行使用了它需要的空间(它需要的最大空间是有限的,但依赖于窗口的宽度)。 底行应使用剩余空间。 最棘手的部分是排在前列。 其尺寸可以根据一个按钮,切换内容的很大一部分的可见性而变化。 我想它利用身高的最多50%,但比它真正需要的不是更多。 下面的XAML介绍我想要完成的任务:
<Grid.RowDefinitions>
<!-- neither "1*" nor "Auto" fully meets my needs -->
<RowDefinition Height="Min(1*,Auto)"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
该行是:
-
WrapPanel
-
WrapPanel
-
TextBox
如果这是非常重要的。
如果我的理解对不对,你很可能使用Auto
,然后绑定MaxHeight
属性的Height
中的Grid
。 也许是这样的:
MaxHeightConverter.cs:
public class MaxHeightConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
throw new ArgumentException("MaxHeightConverter expects a height value", "values");
return ((double)value / 2);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
MyWindow.xaml:
...
xmlns:converters="clr-namespace:MyApp.Namespace"
...
<Window.Resources>
<converters:MaxHeightConverter x:Key="MaxHeightValue" />
</Window.Resources>
<Grid x:Name="root">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<WrapPanel >
<WrapPanel.MaxHeight>
<Binding Converter="{StaticResource MaxHeightValue}" ElementName="root" Path="ActualHeight" />
</WrapPanel.MaxHeight>
</WrapPanel>
</Grid>
...
希望这可以帮助。
你可以只用XAML做另一种方式是结合一个隐藏的对象,它是你想要的高度:
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Border Background="White" Visibility="Hidden" x:Name="HalfHeightRow" x:FieldModifier="private" />
</Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Height="1000" Background="Red" MaxHeight="{Binding ActualHeight, ElementName=HalfHeightRow}" />
<Border Grid.Row="1" Height="100" Background="Green" />
<Border Grid.Row="2" Background="Blue" />
</Grid>
你可以让马特的建议,更简单,更清晰。
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*" x:Name="HalfHeightRow"/>
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
</Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MaxHeight="{Binding ActualHeight, ElementName=HalfHeightRow}"/>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Height="1000" Background="Red" />
<Border Grid.Row="1" Height="100" Background="Green" />
<Border Grid.Row="2" Background="Blue" />
</Grid>