【问题标题】:Convert string to Control name c# wp8.1将字符串转换为控件名称 c# wp8.1
【发布时间】:2016-03-31 07:53:48
【问题描述】:

在我的 MainPage.xaml 中,有 20 个按钮控件,分别命名为 btn1、btn2、btn3、... ... btn20。现在我需要在后面的代码中使用这个按钮。

我打算使用 for 循环并为每个按钮编写代码。但我的问题是我无法将字符串转换为按钮名称。

例如,

for (int i = 1; i <=20; i++)
{
     string button = "btn" + i;

     // Convert string to button somehow
     // Do something with button
}

我在 Google 上搜索过,有很多关于从字符串转换控件名称的文章。但它们适用于 Windows 窗体。 Windows 手机应用不支持这些命名空间。

【问题讨论】:

  • 将字符串转换为控件名称是什么意思?你的意思是只知道它的名字就实例化一个控件类吗?例如,TextBox?
  • 我已经编辑了我的问题。检查一下
  • 啊,我明白了。我明白这个问题

标签: c# windows-phone-8 windows-runtime windows-phone-8.1 win-universal-app


【解决方案1】:

你可以这样做

for (int i = 1; i <=20; i++)
{
       Button ele =  (Button) MainGrid.FindName("btn"+i);
}

这里 MainGrid 是具有按钮控件的 Grid 元素的名称

【讨论】:

  • 感谢您的回答。几乎 90% 正确。但是你错过了一条线。
  • @ShahriarSirajSnigdho 正如我在您自己的自动回答中所说,您应该指出 Archana 如何改进他/她自己的答案,顺便说一句,这个答案没有任何问题。它只是给了你提示。使用is 和后来的as 是两次投射对象,对,但对我来说,不认为这个答案是正确的答案是不够的............
  • 我刚刚写了“是”条件。如果您确定它的按钮元素,那么您可以删除该行
  • 您的 if 条件无关紧要。因为我试图从 xaml 页面中查找按钮,当然我确定我正在搜索的名称是一个按钮。但是,如果您不添加此行Button button = ele as Button;,您的代码将无法正常工作。在 Visual Studio 中尝试一下。
  • Button ele = (Button) MainGrid.FindName("button");将工作。检查更新的答案
【解决方案2】:

您不能将字符串转换为按钮实例,但您需要使用反射获取btnN(例如btn1)类字段值: p>

Button button = (Button)GetType().GetField($"btn{i}", BindingFlags.Instance).GetValue(this);

甚至更有效的方法:使用字典查找按钮:

// Place this in your form constructor
Dictionary<string, Button> buttons = new Dictionary<string, Button>
{
    { "btn1", btn1 },
    { "btnN", btn2 }
};

// and later where you want to get your buttons by their name...
Button btn1 = buttons[$"btn{i}"];

【讨论】:

  • GetField 和 BindingFlags 在当前上下文中不存在 :(
  • @ShahriarSirajSnigdho 真的吗? ;) 你是直接打电话给GetType().GetField() 还是GetField()?并且 BindingFlags 是 System.Reflection 命名空间的成员...添加一个 using 到整个命名空间
  • @ShahriarSirajSnigdho 顺便说一句,你为什么不采用第二种方法?使用字典的那个。效率上比反射好
  • 老实说,我认为这些都不是一种有效的方法
  • @ShahriarSirajSnigdho 这个结论是你自己的意见。字典无论大小如何,都有恒定的访问时间。比这更有效是不可能的:D
【解决方案3】:

终于找到了解决办法

    for (int i = 1; i <= 20; i++) 
        {
            var ele = GridMain.FindName("btn" + i);

            // @Archana you missed this line
            Button button = ele as Button;

            // Do what you want to do with your control 
            button.Background = background;
            button.Foreground = foreground;                
        }

【讨论】:

  • 顺便说一句,我不认为你的自动回答是诚实的。如果它为您提供了解决方案的正确方向,您应该放弃它并将 Archana 标记为正确的一个
  • 您可以直接将 FindName 值分配给 Button 类型。不需要额外的行(Button button = ele as Button)
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 2022-11-09
  • 2016-02-06
  • 1970-01-01
  • 2012-05-24
  • 2015-04-02
  • 2015-07-26
  • 2012-02-22
相关资源
最近更新 更多