У меня есть сетка, и мне нужно динамически заменить элемент управления, который находится в одной из ячеек. Я не знаю, с точки зрения синтаксиса, чтобы определить ячейку сетки, как где я помещаю номер строки и столбца, чтобы я мог удалить все, что в ней есть.Silverlight: удалить содержимое определенной ячейки в сетке
ответ
Если вы знаете ячейку и грести, что управление живет, вы можете использовать LINQ чтобы захватить его.
Вот заявление LINQ, который получит первый элемент управления, который находится в колонке 3, строка 4.
var control = (from d in grid.Children
where Grid.GetColumn(d as FrameworkElement) == 3
&& Grid.GetRow(d as FrameworkElement) == 4
select d).FirstOrDefault();
Вы можете перебирать дочерние элементы сетки, проверяя их значения строк и столбцов, используя методы Grid.GetRow и Grid.GetColumn и заменяя целевой контент при совпадении значений. Вот образец, испытанный в WPF, но должны работать в Silverlight:
<Grid x:Name="SampleGrid">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Rectangle Fill="Red" Width="20" Height="20" Grid.Row="0" Grid.Column="0" />
<Rectangle Fill="Orange" Width="20" Height="20" Grid.Row="0" Grid.Column="1" />
<Rectangle Fill="Yellow" Width="20" Height="20" Grid.Row="0" Grid.Column="2" />
<Rectangle Fill="Green" Width="20" Height="20" Grid.Row="1" Grid.Column="0" />
<Rectangle Fill="Blue" Width="20" Height="20" Grid.Row="1" Grid.Column="1" />
<Rectangle Fill="Indigo" Width="20" Height="20" Grid.Row="1" Grid.Column="2" />
<Rectangle Fill="Violet" Width="20" Height="20" Grid.Row="2" Grid.Column="0" />
<Rectangle Fill="Black" Width="20" Height="20" Grid.Row="2" Grid.Column="1" />
<Rectangle Fill="Gray" Width="20" Height="20" Grid.Row="2" Grid.Column="2" />
<Button Grid.Row="3" Grid.ColumnSpan="3" Margin="10" x:Name="Swap" Click="Swap_Click" Content="Swap"/>
</Grid>
В обработчик событий:
private void Swap_Click(object sender, RoutedEventArgs e)
{
Ellipse newEllipse = new Ellipse() { Fill = new SolidColorBrush(Colors.PaleGoldenrod), Width = 20d, Height = 20d };
for (int childIndex = 0; childIndex < this.SampleGrid.Children.Count; childIndex++)
{
UIElement child = this.SampleGrid.Children[childIndex];
if (Grid.GetColumn(child) == 2 && Grid.GetRow(child) == 2)
{
this.SampleGrid.Children.Remove(child);
Grid.SetRow(newEllipse, 2);
Grid.SetColumn(newEllipse, 2);
this.SampleGrid.Children.Add(newEllipse);
}
}
}
Если бы добавить, что если у вас есть большое количество или ряд/перевалы вы можете добавить заявление перерыва, чтобы избежать итерации оставшихся детей как только вы попали в цель. –
Вы можете помнить де управления, который я положил в сетке добавив приватную переменную:
private Control controlCentral = null;
Затем назначьте этой переменной элемент управления, который вы добавляете в сетку, чтобы вы могли использовать Удалить для удаления управления сеткой.
Следующий код заменить контроль строки 0 столбец 1:
private void MostrarControlCentral(Control control)
{
if (control != null)
{
control.SetValue(Grid.RowProperty, 0);
control.SetValue(Grid.ColumnProperty, 1);
}
this.LayoutRoot.Children.Remove(this.controlCentral);
if (control != null)
{
this.LayoutRoot.Children.Add(control);
}
this.controlCentral=control;
}
Nice - еще раз LINQ справляется с необходимостью для циклов. –