将控件转换为网格中的TextBlock

时间:2016-04-08 07:32:54

标签: c# wpf casting textblock

我在TextBlocks中有一组Grid,我希望能够以编程方式访问其.Text属性。 Buttons中还有ImagesGrid,所以我已经完成了一些验证;

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

这样做我得到一个错误,

  

无法转换类型' System.Windows.Controls.Control'至   ' System.Windows.Controls.TextBlock'通过参考转换,拳击   转换,取消装箱转换,包装转换或null类型   转化

如何才能正确投射Control,以便我只能访问TextBlocks中的Grid

最终修改TextBlock.Text内的所有Buttons都被命名,但它们都是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将获取上一个string的{​​{1}}值。我想要的是DataRowTextBlock1.Text = row1等等。

1 个答案:

答案 0 :(得分:1)

只需使用OfType,就像这样:

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

或者您可以将Control替换为var中的 UIElement 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;
    }
}

编辑:要在按钮内找到TextBlock,您可以这样做:

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