未定义父级大小时,网格宽度“*”的行为不符合预期

问题描述 投票:0回答:3
wpf
3个回答
1
投票

当您的外部网格托管在未定义宽度的容器中时,实际宽度将是后代的结果。也就是说,(外部)网格测量通道将“询问”右列(边框):“我正在给您任何您想要的空间:您需要多少?”。只要边框片段不需要任何特定大小,结果就是默认值(在大多数情况下为零)。因此出现了崩溃的行为。

基本上,您应该定义外部网格宽度或第二列宽度(意味着列内的任何内容都应该告诉它需要多少空间)。


0
投票

你是对的

*
意思是取与网格成正比的大小。发生这种情况是因为您最高的
Grid
没有足够的空间变宽(当您设置
Width="450"
时,
Grid
会变宽)。

如果你的

Window
内只有一个网格,那么
theSecondColumn
将占据右侧的所有位置(它会根据你的需要更宽):

<Window x:Class="DataGridAddedColumns.MainWindow"
    <!-- The code is omitted for the brevity -->
        Title="MainWindow" Height="550" Width="525"  
          WindowStartupLocation="CenterScreen">
    <Grid Name="grid">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Name="theSecondColumn" Width="*"/>
         </Grid.ColumnDefinitions>
    <Grid>
</Window>

0
投票

我发现Border有一个问题,当它的大小应该与具有

*
列/行的网格单元相匹配时。

有问题的例子:

<Grid>
    ...
    <Border Grid.Row="1" Grid.Column="1"
            HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        ...
    </Border>
</Grid>

解决方案:将边框放在辅助网格内,因为对于网格内的网格,单元格对齐效果很好。然后将 Border 的宽度和高度绑定到 Grid 的

ActualHeight
/
ActualWidth

<Grid>
    ...
    <Grid x:Name="borderGrid" Grid.Row="1" Grid.Column="1">
        <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                Height="{Binding ActualHeight, ElementName=borderGrid}"
                Width="{Binding ActualWidth, ElementName=borderGrid}">
            ...
        </Border>
    </Grid>
</Grid>

因此,即使更改根网格的大小,边框也会正确适合其目标单元格。 (在使用 ColumnSpan 和 RowSpan 时也适用。)

© www.soinside.com 2019 - 2024. All rights reserved.