将控件投射到网格中的 TextBlock

Casting Control to TextBlock in a Grid

我在 Grid 中有一组 TextBlocks,我希望能够以编程方式访问它们的 .Text 属性。 Grid里面还有ButtonsImages,所以我做了一些这样的验证;

foreach (Control control in navButtonGrid.Children)
{
    if (control.GetType() == typeof(TextBlock))
    {
        //TextBlock.Text here
    }
}

在执行此操作时出现错误,

Cannot convert type 'System.Windows.Controls.Control' to 'System.Windows.Controls.TextBlock' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

我怎样才能正确地转换我的 Control 以便我只能访问 Grid 中的 TextBlocks

最终编辑: 我将 Buttons 中的所有 TextBlock.Text 命名,但它们都是相同的 Text。这是我的实现;

int i = 0;
foreach (DataRow row in navButtonDT.Rows)
{
    foreach (UIElement control in navButtonGrid.Children)
    {
        if (control.GetType() == typeof(Button))
        {
            TextBlock tb = ((control as Button).Content as StackPanel).Children.OfType<TextBlock>().FirstOrDefault();
            tb.Text = navButtonDT.Rows[i][1].ToString();
        }
    }
    i++;
}

如果我这样做,所有 TextBlocks 都采用最后一个 DataRowstring 值。我想要的是 TextBlock1.Text = row1TextBlock2.Text = row2 等等……

只需像这样使用OfType

foreach (var control in navButtonGrid.Children.OfType<TextBlock>())
{
    //Do your stuff with control      
}

或者您可以将 Control 替换为 varUIElement in foreach:

foreach (var control in navButtonGrid.Children)
{
    if (control.GetType() == typeof(TextBlock))
    {
         TextBlock tb = control as TextBlock;
    }
}

或:

foreach (UIElement control in navButtonGrid.Children)
{
    if (control.GetType() == typeof(TextBlock))
    {
        TextBlock tb = control as TextBlock;
    }
}

编辑:要在 Button 中找到 TextBlock,您可以这样做:

else if (control.GetType() == typeof(Button))
{
    TextBlock tb = ((control as Button).Content as StackPanel).Children.OfType<TextBlock>().FirstOrDefault();
}