2009-04-14 17 views

Antwort

10

Wenn Sie die Zelle kennen und rudern, dass die Steuerung in lebt, können Sie eine LINQ Aussage, um es zu greifen.

Hier ist eine LINQ-Anweisung, die die erste Kontrolle erhalten, die in Spalte 3 ist, Zeile 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

Nett - noch einmal LINQ macht Schleifen überflüssig. –

1

Sie können die untergeordneten Elemente des Gitters iterieren, indem Sie ihre Zeilen- und Spaltenwerte mit den Methoden Grid.GetRow und Grid.GetColumn überprüfen und den Zielinhalt ersetzen, wenn die Werte übereinstimmen. Hier ist ein Beispiel in WPF getestet, sollte aber in Silverlight arbeiten:

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

im Ereignishandler:

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

haben Hinzuzufügen ist, dass, wenn Sie eine große Anzahl oder Reihe haben/cols Sie könnten eine break-Anweisung hinzufügen möchten die übrigen Kinder zu vermeiden Iterieren sobald du dein Ziel getroffen hast. –

0

Sie de control erinnern kann, dass ich in dem Gitter eine private Variable Zugabe setzen:

private Control controlCentral = null; 

Ordnen Sie als Nächstes dieser Variablen das Steuerelement zu, das Sie dem Raster hinzufügen, sodass Sie Remove verwenden können, um die Steuerung des Rasters zu entfernen.

Der nächste Code ersetzen die Steuerung der Zeile 0 Spalte 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; 
    } 
Verwandte Themen