1

In meiner MainPage.xaml gibt es 20 Schaltflächensteuerelemente mit dem Namen btn1, btn2, btn3, ... ... btn20. Jetzt muss ich diese Tasten im Code dahinter verwenden.Konvertieren Zeichenfolge in Steuerelementname C# wp8.1

Ich plane die Verwendung einer for-Schleife und den Code für jede Schaltfläche. Aber mein Problem ist, ich bin nicht in der Lage, Zeichenfolge in Button-Name zu konvertieren.

Zum Beispiel

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

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

Ich habe bei Google gesucht und es gibt viele Artikel über Umwandlung von Steuer Namen von String. Aber sie sind für Windows Forms. Windows Phone Apps unterstützen diese Namespaces nicht.

+0

Was meinen Sie mit String-Umwandlung Namen zu kontrollieren? Meinst du, eine Kontrollklasse instanziieren, nur um ihren Namen zu wissen? Zum Beispiel, 'TextBox'? –

+0

Ich habe meine Frage bearbeitet. Überprüfen Sie es –

+0

Ah, ich verstehe. Ich verstehe das Problem –

Antwort

2

Sie können

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

Hier Maingrid der Name des Netzelements, das Button-Steuerelemente

+0

Vielen Dank für Ihre Antwort. Fast 90% richtig. Aber du hast eine Linie verpasst. –

+0

@ShahriarSirajSnigdho Wie ich in deiner eigenen Antwort gesagt habe, solltest du Archana darauf hinweisen, wie er seine eigene Antwort verbessern kann, und BTW, es ist nichts falsch an dieser Antwort. Es gab dir nur einen Hinweis. Mit 'is' und später 'as' wird das Objekt zweimal geworfen, richtig, aber für mich ist es nicht genug, diese Antwort nicht als die richtige zu betrachten ......... –

+0

Ich habe gerade geschrieben" is " Bedingung. Wenn Sie sicher sind, dass das Knopf-Element, dann können Sie diese Linie entfernen – Archana

1

Sie können eine Zeichenfolge an die Button-Instanz nicht konvertieren aber Sie müssen btnN (fe btn1) -Klasse Feldwert mit Reflexion erhalten:

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

Oder sogar eine effizientere Art und Weise: Einsatz ein Wörterbuch Tasten zum nachschlagen:

// 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}"]; 
+0

GetField und BindingFlags existieren nicht im aktuellen Kontext :( –

+0

@ ShahriarSirajSnigdho Wirklich?;) Hatten Sie 'GetType(). GetField()' oder 'GetField()' direkt aufgerufen? Und BindingFlags ist ein Mitglied von 'System.Reflection' Namespace ... fügen Sie eine Verwendung für den gesamten Namespace –

+0

@ ShahriarSirajSnigdho BTW, warum gehst du nicht mit dem 2. Ansatz? Derjenige, der das Wörterbuch benutzt. Es ist besser als Reflexion in Bezug auf die Effizienz –

0

Schließlich hat fand ich eine Lösung

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;     
     } 
+3

BTW, ich finde nicht ehrlich Ihre automatische Antwort. Sie sollten es fallen lassen und Archana eins als das richtige markieren, wenn es Ihnen die richtige Richtung zur Lösung gab –

+0

Natürlich! @ matias-fidemraizer –

+0

Sie können dem Button-Typ den Wert FindName direkt zuweisen. Keine Notwendigkeit für zusätzliche Linie (Button button = ele als Button) – Archana