在WPF中限制“自动”和“1 *”的行高

时间:2012-12-13 12:38:02

标签: c# wpf grid-layout

我有一个WPF应用程序,其布局由顶级Grid中的3行组成。

我希望中间行占用它所需的空间(它所需的最大空间是有限的,但取决于窗口的宽度)。 底行应占用剩余空间。 棘手的部分是顶行。 它的大小可以根据按钮切换大部分内容的可见性而变化。我希望它最多使用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>

行是:

  1. WrapPanel
  2. WrapPanel
  3. TextBox
  4. 如果这很重要。

3 个答案:

答案 0 :(得分:8)

如果我理解正确,您可以使用Auto,然后将MaxHeight属性绑定到Height的{​​{1}}。也许是这样的:

MaxHeightConverter.cs:

Grid

MyWindow.xaml:

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();
    }
}

希望这有帮助。

答案 1 :(得分:7)

另一种只使用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>

答案 2 :(得分:1)

您可以使Matt的建议更加简单明了。

 
<script>
 	// Initialize and add the map
function initMap() {
  // The location of Uluru
  var uluru = {lat: <?php echo $longitude?>, lng: <?php echo $latitude; ?>};
  // The map, centered at Uluru
  var map = new google.maps.Map(
      document.getElementById('map'), {zoom: 12, center: uluru});
  // The marker, positioned at Uluru
  var marker = new google.maps.Marker({position: uluru, map: map});
}
 </script>