none
Barra de botones RRS feed

  • Pregunta

  • Buenas tardes, tiempo sin saludarlos, tengo la siguienta cosa, tengo mi ventana principal, a la cual le voy adicionando varios usercontrol dependiendo de lo que nesecito, en cada user control he creado los respectivos botones, lo que quiero es que cuando le haga el llamado a un user control, los botones creados alli, me aparescan en la barra de botones de mi ventana principal, he intentado, pero no encuentro la colleccion de botones de hechos en el usercontrol para poder pasarlos a la colleccion de la ventan principal.

     

    gracias por su ayuda. 


    Si esta informacion dio solucion a tu duda marcala como respuesta. Saludos
    lunes, 25 de abril de 2011 20:11

Respuestas

  • Hola Wipito.

    hace tiempo se compartio una clase para recorrer el arbol visual y obtener controles de un tipo concreto y nombre, como no se por donde anda el post y es algo habitual, pongo aqui el codigo que yo tengo mediante el cual puedes buscar controles.

    clase con metodos extensores para buscar controles:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Media;
    using System.Windows;
    
    namespace Zelion.Helpers
    {
    
      public static class HelperWPFTreeView
      {
    
      #region [metodos extensores]
    
        /// <summary>
        /// Metodo extensor para obtener una lista de hijos en el arbol visual del objeto especificado.
        /// </summary>
        /// <typeparam name="T">Tipo de control que quiere obtenerse</typeparam>
        /// <param name="_obj">objeto de dependencia en el cual se buscara</param>
        /// <param name="_name">nombre del control/controles a buscar, null para obtener todos los que coincidan con el tipo</param>
        /// <returns>
        /// lista del tipo de control a buscar con todos los controles coincidentes con el nombre y tipo. 
        /// null en caso de no encontrar ninguno
        /// </returns>
        public static List<T> GetChildObjects<T>(this DependencyObject _obj, string _name = null)
        {
          var retVal = new List<T>();
          for (int i = 0; i < VisualTreeHelper.GetChildrenCount(_obj); i++)
          {
            object c = VisualTreeHelper.GetChild(_obj, i);
            if (c.GetType().FullName == typeof(T).FullName && (String.IsNullOrEmpty(_name) || ((FrameworkElement)c).Name == _name))
            {
              retVal.Add((T)c);
            }
            var gc = ((DependencyObject)c).GetChildObjects<T>(_name);
    
            if (gc != null) retVal.AddRange(gc);
          }
    
          return retVal;
        }
    
        /// <summary>
        /// Metodo extensor para obtener un hijo en el arbol visual del objeto especificado.
        /// </summary>
        /// <typeparam name="T">Tipo de control que quiere obtenerse</typeparam>
        /// <param name="_obj">objeto de dependencia en el cual se buscara</param>
        /// <param name="_name">nombre del control a buscar, null para obtener todos los que coincidan con el tipo</param>
        /// <returns>control coincidentes con el nombre y tipo. null en caso de no encontrarlo</returns>
        public static T GetChildObject<T>(this DependencyObject _obj, string _name = null) where T : DependencyObject
        {
          for (int i = 0; i < VisualTreeHelper.GetChildrenCount(_obj); i++)
          {
            object c = VisualTreeHelper.GetChild(_obj, i);
            if (c.GetType().FullName == typeof(T).FullName && (String.IsNullOrEmpty(_name) || ((FrameworkElement)c).Name == _name))
            {
            return (T)c;
            }
            object gc = ((DependencyObject)c).GetChildObject<T>(_name);
    
            if (gc != null) return (T)gc;
          }
    
          return null;
        }
    
      #endregion
    
      }
    }
    

    Bueno, no hay mucho que decir de esta clase. Tan solo son 2 metodos extensores que recorren el arbol visual para buscar el/los controles de un tipo especificado con o sin nombre.

    Añadiendo esta clase, puedes hacer algo como :

    NombreUserControl.GetChildObjects<Button>();

    El cual te retornara todos los botones que tiene el control de usuario.

    ya contaras si te sirve.

     

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Propuesto como respuesta CorsarioVasco martes, 26 de abril de 2011 14:21
    • Marcado como respuesta Wipito martes, 26 de abril de 2011 19:03
    martes, 26 de abril de 2011 13:47
    • Propuesto como respuesta David_González martes, 26 de abril de 2011 17:14
    • Marcado como respuesta Wipito martes, 26 de abril de 2011 19:03
    martes, 26 de abril de 2011 14:20

Todas las respuestas

  • Hola Wipito.

    hace tiempo se compartio una clase para recorrer el arbol visual y obtener controles de un tipo concreto y nombre, como no se por donde anda el post y es algo habitual, pongo aqui el codigo que yo tengo mediante el cual puedes buscar controles.

    clase con metodos extensores para buscar controles:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Media;
    using System.Windows;
    
    namespace Zelion.Helpers
    {
    
      public static class HelperWPFTreeView
      {
    
      #region [metodos extensores]
    
        /// <summary>
        /// Metodo extensor para obtener una lista de hijos en el arbol visual del objeto especificado.
        /// </summary>
        /// <typeparam name="T">Tipo de control que quiere obtenerse</typeparam>
        /// <param name="_obj">objeto de dependencia en el cual se buscara</param>
        /// <param name="_name">nombre del control/controles a buscar, null para obtener todos los que coincidan con el tipo</param>
        /// <returns>
        /// lista del tipo de control a buscar con todos los controles coincidentes con el nombre y tipo. 
        /// null en caso de no encontrar ninguno
        /// </returns>
        public static List<T> GetChildObjects<T>(this DependencyObject _obj, string _name = null)
        {
          var retVal = new List<T>();
          for (int i = 0; i < VisualTreeHelper.GetChildrenCount(_obj); i++)
          {
            object c = VisualTreeHelper.GetChild(_obj, i);
            if (c.GetType().FullName == typeof(T).FullName && (String.IsNullOrEmpty(_name) || ((FrameworkElement)c).Name == _name))
            {
              retVal.Add((T)c);
            }
            var gc = ((DependencyObject)c).GetChildObjects<T>(_name);
    
            if (gc != null) retVal.AddRange(gc);
          }
    
          return retVal;
        }
    
        /// <summary>
        /// Metodo extensor para obtener un hijo en el arbol visual del objeto especificado.
        /// </summary>
        /// <typeparam name="T">Tipo de control que quiere obtenerse</typeparam>
        /// <param name="_obj">objeto de dependencia en el cual se buscara</param>
        /// <param name="_name">nombre del control a buscar, null para obtener todos los que coincidan con el tipo</param>
        /// <returns>control coincidentes con el nombre y tipo. null en caso de no encontrarlo</returns>
        public static T GetChildObject<T>(this DependencyObject _obj, string _name = null) where T : DependencyObject
        {
          for (int i = 0; i < VisualTreeHelper.GetChildrenCount(_obj); i++)
          {
            object c = VisualTreeHelper.GetChild(_obj, i);
            if (c.GetType().FullName == typeof(T).FullName && (String.IsNullOrEmpty(_name) || ((FrameworkElement)c).Name == _name))
            {
            return (T)c;
            }
            object gc = ((DependencyObject)c).GetChildObject<T>(_name);
    
            if (gc != null) return (T)gc;
          }
    
          return null;
        }
    
      #endregion
    
      }
    }
    

    Bueno, no hay mucho que decir de esta clase. Tan solo son 2 metodos extensores que recorren el arbol visual para buscar el/los controles de un tipo especificado con o sin nombre.

    Añadiendo esta clase, puedes hacer algo como :

    NombreUserControl.GetChildObjects<Button>();

    El cual te retornara todos los botones que tiene el control de usuario.

    ya contaras si te sirve.

     

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Propuesto como respuesta CorsarioVasco martes, 26 de abril de 2011 14:21
    • Marcado como respuesta Wipito martes, 26 de abril de 2011 19:03
    martes, 26 de abril de 2011 13:47
    • Propuesto como respuesta David_González martes, 26 de abril de 2011 17:14
    • Marcado como respuesta Wipito martes, 26 de abril de 2011 19:03
    martes, 26 de abril de 2011 14:20
  • si, esos son.

    Que olfato tienes Corsario ... :)


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    martes, 26 de abril de 2011 17:13
  • Muchas Gracias caballeros, es precisamente lo que necesitaba.
    Si esta informacion dio solucion a tu duda marcala como respuesta. Saludos
    martes, 26 de abril de 2011 19:03