2012-09-02 14 views
15

que busco ayuda para encontrar la mejor manera de referirse a los controles que se han construido programmtically en C#Encuentra control de WPF por Nombre

Si pre incluir una etiqueta en XAML y el nombre de marketInfo a continuación en el código que pueda establecer la propiedad Tag con algo como

marketInfo.Tag = timeNow; 

Sin embargo, estoy construyendo controles y asignar cada una un nombre usando algo similar 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; 

¿Cómo me refiero a estos controles desde otro método? He leído algunas publicaciones que sugieren usar el visualtreehelper, pero parece que esto requiere controles de bucle para encontrar un control en particular. ¿Hay alguna forma de acceder a un control por nombre para evitar el bucle?

por ejemplo, algo similar a

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

Gracias

Respuesta

32

Hay al menos dos maneras de hacerlo:

  • Use el método del contenedor primario FindName para encontrar el control de: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname(v=vs.110).aspx (pero implicará internamente bucles, como el elemento de ayuda visual)

  • crear un diccionario para almacenar una referencia para cada control se crea

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

    entonces usted puede hacer:

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

El diccionario es un método mucho mejor que la recursión, especialmente porque los controles que necesito son todos los niños de varias capas de profundidad. Debería haber pensado en eso. Gracias. – user3357963

+3

Este fue un gran consejo, no funcionó para mí, pero me llevó a lo que funcionó. Tuve que usar 'control.Template.FindName (" nombre ")' para obtener el elemento secundario que necesitaba. – Fred

0

Usted puede utilizar XamlQuery para encontrar sus controles en tiempo de ejecución. XamlQuery In CodePlex

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