2012-09-02 11 views
15

che sto cercando aiuto per trovare il modo migliore per fare riferimento ai controlli che sono stati programmtically costruito in C#Trova controllo WPF per nome

Se ho pre includere un'etichetta in XAML e il nome marketInfo poi nel codice che posso impostare la proprietà Tag con qualcosa di simile

marketInfo.Tag = timeNow; 

Tuttavia, sto costruendo controlli e assegnando a ciascuna un nome con qualcosa di simile a

System.Windows.Controls.Label lbl = new System.Windows.Controls.Label(); 
lbl.Content = market.name + " - " + DateTime.Now.ToLocalTime().ToLongTimeString(); 
lbl.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left; 
lbl.Height = 40; 
lbl.Name = @"_" + "marketInfo" + countMarket; 

Come faccio a fare riferimento a questi controlli da un altro metodo? Ho letto alcuni post che suggeriscono di utilizzare lo visualtreehelper ma sembra richiedere controlli di loop per trovare un particolare controllo. C'è un modo per accedere a un controllo per nome per evitare il loop?

ad esempio qualcosa di simile a

//pseudo code 
SomeControl("_marketInfo5").Tag = timeNow; 

Grazie

risposta

32

Ci sono almeno due modi per farlo:

  • utilizzare il metodo del contenitore padre FindName per trovare il controllo di: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname(v=vs.110).aspx (ma coinvolgerà internamente il ciclo, come il visualtreehelper)

  • .210
  • creare un dizionario per memorizzare un punto di riferimento per ogni controllo si crea

    var controls = new Dictionary<string, FrameworkElement>(); 
    controls.Add("_marketInfo5", lbl); 
    

    allora si può fare:

    controls["_marketInfo5"].Tag = timeNow; 
    
+0

Il dizionario è un metodo molto migliore rispetto alla ricorsione, soprattutto perché i controlli di cui ho bisogno sono tutti i bambini con diversi livelli di profondità. Avrei dovuto pensarci. Grazie. – user3357963

+3

Questo è stato un grande suggerimento, non ha funzionato per me, ma mi ha portato a cosa ha funzionato. Ho dovuto usare 'control.Template.FindName (" name ")' per ottenere il bambino di cui avevo bisogno. – Fred

0

È possibile utilizzare XamlQuery per trovare i controlli in fase di esecuzione. XamlQuery In CodePlex

XamlQuery.Search(RegisterGrid, "Label[Name=_marketInfo5]").SetValue(Control.TagProperty, timeNow);