2009-04-14 105 views

回答

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

不错 - LINQ再一次消除了对循环的需求。 – 2009-04-15 06:28:15

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

应该补充,如果你有大量的或行/ COLS你可能要添加一个break语句,以避免迭代剩下的孩子一旦你击中了你的目标。 – 2009-04-14 15:12:46

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; 
    } 
相关问题