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 的回答就是您的选择。
所以我编写了一些代码,通过调用 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 的回答就是您的选择。