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

时间:2018-12-08 22:48:07

标签: c# xaml dynamic uwp uwp-xaml

所以我编写了一些代码,通过调用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?

2 个答案:

答案 0 :(得分:1)

只需在列表中创建文本块即可。因此,您可以使用索引的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";
    }
} 

答案 1 :(得分:1)

如果StackPanel仅包含要动态添加的TextBlock元素,则也可以通过以下方式访问它们:

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

此方法使用OfType<T> LINQ扩展方法,该方法按指定的类型过滤输入集合,因此它仅返回Stacky的子元素TextBlock

如果您有更多内容,请在StackPanel中使用@Vignesh G的答案。