C# (UWP) - 从字符串变量动态访问对象

C# (UWP) - Access object dynamically from string-variable

所以我编写了一些代码,通过调用 for 循环从字符串列表中创建 TextBlocks:

List<string> menuPages = new List<string>() { "Home", "Media", "Settings" };
//method called from constructor:
private void createHeaders ()
{
    for (int i=0; i<menuPages.Count; i++)
    {
        TextBlock iheader = new TextBlock();
        iheader.Name = menuPages[i];
        iheader.Text = menuPages[i];
        if (i==pageIndex)
        { iheader.FontSize = 36; }
        else
        { iheader.FontSize = 32; }
        stacky.Children.Add(iheader); //Adding button to stack panel
    }
}

现在我一直在编写另一种方法,该方法将循环遍历每个 TextBlock 并将文本更改为我想要的任何内容。我得到了一个为 stackPanel 子级工作的 foreach 循环:(stacky.Children 中的 TextBlock tBlock) 但我需要使用索引 for 循环。下面的代码是我想要实现这一目标的方式:

//Re-render headers
for (int i = 0; i < menuPages.Count; i++)
{
    //TextBlock menuPages[i].text = "foo";
}

现在上面的语法当然不起作用,所以我的问题是,如何从列表中的字符串中找到 TextBlocks?

只需在列表中创建您的文本块。因此,您可以使用索引 forloop 轻松操作。

List<string> menuPages = new List<string>() { "Home", "Media", "Settings" };
List<TextBlock> textBlocks = new List<TextBlock>();

public MainPage()
{
    this.InitializeComponent();
    createHeaders();
}

private void createHeaders()
{
    for (int i = 0; i < menuPages.Count; i++)
    {
        TextBlock iheader = new TextBlock();
        iheader.Name = menuPages[i];
        iheader.Text = menuPages[i];              
        iheader.FontSize = 32;
        textBlocks.Add(iheader);
        Stacky.Children.Add(iheader); 
    }
}

private void change_Click(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < textBlocks.Count; i++)
    {
        textBlocks[i].Text = "foo";
    }
} 

如果 StackPanel 只包含您动态添加的 TextBlock 元素,您也可以通过这种方式访问​​它们:

foreach (var textBlock in Stacky.Children.OfType<TextBlock>())
{
   textBlock.Text = "something";
}

此方法使用 OfType<T> LINQ 扩展方法,该方法按指定类型过滤输入集合,因此它仅 returns Stacky 的那些 TextBlock.

如果您有更多内容,在 StackPanel 中,那么@Vignesh G 的回答就是您的选择。