2017-01-30 27 views
0

我在XAML中制作了一个5x5的网格,其中每行放置了一个TextBlock和一个边框5次。它看起来像这样:image无法用[]将索引应用于'Border'类型的表达式

我想要创建一个动画,通过行来显示用户它正在检查输入。 (只是为了使它看起来程序正在做某些事情,实际检查发生的方式不同)。

第一行(我砍最后的边界段休息后关闭)的XAML代码:

<Grid BorderThickness="1" BorderBrush="Black"> 
    <Grid Margin="10" BorderThickness="1" BorderBrush="White" Width="350" Grid.RowSpan="4" Grid.ColumnSpan="2" Height="450"> 
     <Grid.Resources> 
      <SolidColorBrush x:Key="brush" Color="Silver"/> 
     </Grid.Resources> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <Border x:Name="borderRow1Column1" Grid.Column="0" Grid.Row="0" BorderBrush="{StaticResource brush}" BorderThickness="1" Width="50" Height="50"> 
      <TextBlock x:Name="tbRow1column1" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"></TextBlock> 
     </Border> 
     <Border x:Name="borderRow1Column2" Grid.Column="1" Grid.Row="0" BorderBrush="{StaticResource brush}" BorderThickness="1" Width="50" Height="50"> 
      <TextBlock x:Name="tbRow1column2" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"></TextBlock> 
     </Border> 
     <Border x:Name="borderRow1Column3" Grid.Column="2" Grid.Row="0" BorderBrush="{StaticResource brush}" BorderThickness="1" Width="50" Height="50"> 
      <TextBlock x:Name="tbRow1column3" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24" ></TextBlock> 
     </Border> 
     <Border x:Name="borderRow1Column4" Grid.Column="3" Grid.Row="0" BorderBrush="{StaticResource brush}" BorderThickness="1" Width="50" Height="50"> 
      <TextBlock x:Name="tbRow1column4" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"></TextBlock> 
     </Border> 
     <Border x:Name="borderRow1Column5" Grid.Column="4" Grid.Row="0" BorderBrush="{StaticResource brush}" BorderThickness="1" Width="50" Height="50"> 
      <TextBlock x:Name="tbRow1column5" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"></TextBlock> 
     </Border> 

     <!-- More Rows following after this one --> 

    </Grid> 

现在,我想有一个循环,通过该行中的每个文本块去,和而不是复制粘贴它,我想通过具有索引的for循环来减少代码。

private void displayCheckAnimation() 
    { 
     Color gray = Color.FromArgb(255, 128, 128, 128); 
     Color black = Color.FromArgb(255, 255, 255, 255); 

     Border borderRow1Column = new Border(); 
     for (int i = 0; i < 5; i++) 
     { 
      borderRow1Column[i].Background = new SolidColorBrush(gray); 
      Task.Delay(50).Wait(); 
      borderRow1Column[i].Background = new SolidColorBrush(black); 
      Task.Delay(50).Wait(); 
     } 
    } 

但是,这给我的错误

CS0021 Cannot apply indexing with [] to an expression of type 'Border' 

的任何解决方案,我怎么可以通过我行的循环?

回答

0

你得到这个异常的原因是因为你声明了一个边界并试图将它作为一个边界数组索引。您应该使用实际的边界实例。

不改变你的XAML,我可以看到一些这样做的方法。您可以使用反射来获取特定的边界,或者先创建一个所有边界的列表,然后循环访问列表。

使用反射,您可以使用名称的字符串获取实例。由于可以使用行号和列号轻松构建边框的名称,因此这是一个简单的解决方案。但是,尽管在某些情况下反射可能是一个好主意,但通常不会。

另一种解决方案是首先用你的边框创建一个列表并循环遍历它。就像这样:

List<Border> borders = new List<Border>() 
{ 
    borderRow1Column1, 
    borderRow1Column2, 
    etc. 
} 

foreach (var border in borders) 
{ 
    border.Background = new SolidColorBrush(gray); 
    Task.Delay(50).Wait(); 
    border.Background = new SolidColorBrush(black); 
    Task.Delay(50).Wait(); 
} 

我想告诉你看看WPF中的动画。这些实际上是用于动画。这样可以让它看起来非常漂亮。改变颜色的动画是ColorAnimation

相关问题