0

我有一个关于删除网格的问题:

每当我删除网格中的最后一行或所有行时,网格上仍然会显示一些内容(实际上是最后一行)。我确实检查了 grid.rowdefinitions.count 是否为 0。我使用的方法是 removeAt 和 removeRange(0, grid.rowdefinitions.count)。那有什么问题?谁能告诉我为什么?非常感谢!

//------------
<Grid DockPanel.Dock="Top" HorizontalAlignment="Left" Name="grid1" ShowGridLines="true" Width="200" Height="200">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="100" />
                <TextBlock Grid.Row="1" Grid.Column="0" Text="200" />
                <TextBlock Grid.Row="2" Grid.Column="0" Text="300" />
                <TextBlock Grid.Row="3" Grid.Column="0" Text="400" />
                <TextBlock Grid.Row="4" Grid.Column="0" Text="500" />
            </Grid>
            <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Width="200" DockPanel.Dock="Top">
                <Button Width="80" Click="rem5Row">Remove 5 Rows</Button>
            </StackPanel>

//--------------

private void rem5Row(object sender, RoutedEventArgs e)
        {
            if (grid1.RowDefinitions.Count < 5)
            {
                Console.WriteLine("less than 5!");
            }
            else
            {
                grid1.RowDefinitions.RemoveRange(0,grid1.RowDefinitions.Count);
            }
        }
4

1 回答 1

1

我不确定我是否正确理解了您的问题(并且我不确定代码是否反映了您所说的内容)。但是:你怎么知道“最后一行”正在显示?

我怀疑正在发生的是:您正在删除行并期望这些行中的控件也将被删除。但是,这不是 WPF Grid 的工作方式:控件不是其行的子级,并且当您删除RowDefinition.

因此,所有子控件仍将呈现,但由于它们Grid.Row无效,它们将呈现在“第 0 行”位置。它们以标记顺序呈现,因此最终结果将显示为好像正在显示“最后一行”,因为这是最后绘制的控件。事实上,您的所有控件仍然存在;他们只是在屏幕上的同一个地方。

如果您想确认这一点,您可以使用 Snoop 来检查您的运行时 UI。或者,为您的文本框设置宽度,以便第 0 行框更宽 - 您将清楚地看到重叠。

于 2012-07-26T11:52:32.953 回答