C # (UWP) - динамический доступ к объекту из строковой переменной - PullRequest
0 голосов
/ 09 декабря 2018

Итак, я написал некоторый код, который создает TextBlocks из списка строк, вызывая цикл for:

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 в цикле.и изменить текст на то, что я намерен.Я бы получил цикл foreach, работающий для детей stackPanel: (TextBlock tBlock в stacky.Children), но мне нужно работать с индексированным циклом for.Приведенный ниже код - это то, как я ХОЧУ добиться этого:

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

Теперь, конечно, синтаксис, приведенный выше, не работает, поэтому мой вопрос: как я могу обратиться к TextBlocks из строк в списке?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Если StackPanel содержит только элементы TextBlock, которые вы добавляете динамически, вы также можете получить к ним доступ следующим образом:

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

В этом подходе используется метод расширения OfType<T> LINQ, который фильтруетвходной набор по указанному типу, поэтому он возвращает только тех потомков Stacky, которые TextBlock.

Если у вас есть больше контента, в StackPanel, тогда ответ @Vignesh G будетпуть.

0 голосов
/ 09 декабря 2018

Просто создайте свои текстовые блоки в списке.Таким образом, вы можете легко манипулировать с индексированным 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";
    }
} 
...