2009-04-14 3 views
4

У меня есть сетка, и мне нужно динамически заменить элемент управления, который находится в одной из ячеек. Я не знаю, с точки зрения синтаксиса, чтобы определить ячейку сетки, как где я помещаю номер строки и столбца, чтобы я мог удалить все, что в ней есть.Silverlight: удалить содержимое определенной ячейки в сетке

ответ

10

Если вы знаете ячейку и грести, что управление живет, вы можете использовать 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(); 
+0

Nice - еще раз LINQ справляется с необходимостью для циклов. –

1

Вы можете перебирать дочерние элементы сетки, проверяя их значения строк и столбцов, используя методы 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); 
      } 
     } 

    } 
+0

Если бы добавить, что если у вас есть большое количество или ряд/перевалы вы можете добавить заявление перерыва, чтобы избежать итерации оставшихся детей как только вы попали в цель. –

0

Вы можете помнить де управления, который я положил в сетке добавив приватную переменную:

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