我有一个关于网格移除的问题:
每当我删除网格中的最后一行或所有行时,网格上仍然显示一些内容(实际上是最后一行)。我确实检查了网格。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);
}
}
我不确定我是否正确理解您的问题(我也不确定代码是否反映了您所说的操作)。但是:你怎么知道"最后一行"在显示?
我怀疑正在发生的情况是:您正在删除行,并期望这些行中的控件也被删除。然而,WPF网格的工作方式并非如此:控件不是其行的子控件,并且在删除RowDefinition
时不会删除它们。
因此,所有子控件仍将进行渲染,但由于它们的Grid.Row
无效,它们将在"行0"位置进行渲染。它们是按标记顺序呈现的,因此最终结果将显示为"最后一行",因为这是最后绘制的控件。事实上,您所有的控件仍然存在;他们只是在屏幕上的同一个地方。
如果你想确认这一点,你可以使用Snoop来检查你的运行时UI。或者,设置文本框的宽度,使第0行框更宽——这样你就会清楚地看到重叠。