none
Custom Control - Obtener el Height RRS feed

  • Pregunta

  • hola

    despues de muchas vueltas no pude convencer de desarrollar un control custom, y se hace uso del control PopUp que viene con WPF

    el problema en este caso viene por el lado de conocer cual es el alto de los componentes que contiene
    el problema es que por mas que intente la propiedad ActualHeight siempre esta en cero, es mas tambien especifique el Height="50"
    en el propio contenido, pero no lo quiere tomar

    se me ocurre que podria ser porque el OnInitialized no sea el correcto, pero realizando pruebas note que se pone en forma el Height del contenido
    solo cuando se visualiza el popup

    actualmente lo uso asi, pero como veras debuelve el valor en cero:

        <my:CustomPopUp HorizontalAlignment="Left"  x:Name="customControl11" Placement="MousePoint" Height="auto" Width="auto">
            <Grid Height="50">
                <ToolBar Name="toolbar1" Width="auto" Header="auto">
                    <TextBox BorderBrush="Gray" Width="50"
                                    ToolBar.OverflowMode="Never"/>
                    <Button ToolBar.OverflowMode="Never" Content="Seleccion" />
                    <Button ToolBar.OverflowMode="Never" Content="Eliminar" />
                </ToolBar>
            </Grid>
        </my:CustomPopUp>

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);

            Grid newGrid = this.Child as Grid;
            this.VerticalOffset = newGrid.ActualHeight; // aqui simrpe esta en cero
        }
           
    realizando pruebas implemente una propiedad dentro del custom control

        public double getHeight
        {
            get
            {
                Grid grid = this.Child as Grid;
                return grid.ActualHeight;
            }
        }
           
    y a este lo invoco desde un boton en el formulario

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(customControl11.getHeight.ToString());
        }
           
    pero note que si presiono este boton apenas se visualzia el formulario devuelve cero, pero si lo hago despues de que se visualice al menos
    una vez el popup alli si tiene un valor

    la pregunta seria porque se podria dar esta situacion, no se inicializa el contenido apenas se cra el control ?
    como se pdoria forzar que lo haga?   
       
    gracias
    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 3 de mayo de 2010 13:48

Respuestas

  • Hola Leandro.

    entonces al final si que has creado algo parecido a un control de usuario, ya que estas heredando de Popup.

    ¿necesitas algo en especial que tenga esa clase?, lo comento por que lo ideal es crear con el contenido de CustomPopup un UserControl de modo que ahi puedas implementar la funcionalidad y apariencia, luego para usarlo se inserta dentro de un Popup normal en el xaml, de esta forma se encapsula un UserControl dentro de Popup el cual puedes personalizar como desees.

     

    No obstante, lo que ocurre en tu codigo es que el control aun no se ha renderizado, solo se ha inicializado con todas las propiedades del codigo xaml, de modo que solo puedes obtener su alto con la propiedad height, pero como esta puesta en Auto te va a devolver NAN, de modo que puedes obtener el height del grid o poner un valor en el alto del customPopup.

    Por otro lado la propiedad RenderSize.Height viene a ser la misma que actualHeitght, ya que ambas te dan el alto del control renderizado en pantalla, mientras que height te da el alto que tiene el control y es el unico que se puede modificar.


    Saludos
    David González
    miércoles, 5 de mayo de 2010 7:05

Todas las respuestas

  • Hola Leandro.

    ¿Como dices que estas creando el popup, el tag <my:CustomPopUp> a quien pertenece?.

    ¿al final estas creando un usercontrol o customcontrol para crear el popup?

    en cualquier caso, asegurate de que estableces un alto explicitamente en el control que defines.


    Saludos
    David González
    martes, 4 de mayo de 2010 11:20
  • Que tal, no se si sera lo mismo que en Silverlight, yo a eso lo solucione con

    Objeto.RenderSize.Height

    Previo

    Objeto.UpdateLayout()

    Espero te sea de utilidad

    Saludos

    martes, 4 de mayo de 2010 11:39
  • hola David

    Si asi es volvi al PopUp, analizamos varias alternativas pero al fina no pude convencer que sea un usercontrol, pero tu aporte en los otras consulta fueron de gran ayuda para poder evaluar todas las alternativas

    en cualquier caso, asegurate de que estableces un alto explicitamente en el control que defines.

    si asi es puse un Height fijo en la grilla que contiene el control, ahi lo marque en negrilla,

    <my:CustomPopUp HorizontalAlignment="Left"  x:Name="customControl11" Placement="MousePoint" Height="auto" Width="auto">
            <Grid Height="50" >
                <ToolBar Name="toolbar1" Width="auto" Header="auto">
                    <TextBox BorderBrush="Gray" Width="50"
                                    ToolBar.OverflowMode="Never"/>
                    <Button ToolBar.OverflowMode="Never" Content="Seleccion" />
                    <Button ToolBar.OverflowMode="Never" Content="Eliminar" />
                </ToolBar>
            </Grid>
        </my:CustomPopUp>

    pero dentro en el  OnInitialized() si hago

            protected override void OnInitialized(EventArgs e)
            {
                base.OnInitialized(e);

                this.AllowsTransparency = true;
                this.Child.Opacity = 0.2;

                this.HorizontalOffset = 0;

                Grid grid  = this.Child as Grid;

                this.VerticalOffset = grid.ActualHeight * -1;

            }

    en este caso grid.ActualHeight simpre es cero

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 4 de mayo de 2010 14:06
  • hola samArg

    intente hacer esto

            protected override void OnInitialized(EventArgs e)
            {
                base.OnInitialized(e);

                this.AllowsTransparency = true;
                this.Child.Opacity = 0.2;

                this.HorizontalOffset = 0;

                this.UpdateLayout();

                Grid grid = this.Child as Grid;
                this.VerticalOffset = grid.RenderSize.Height * -1;

            }

    pero grid.RenderSize.Height sigue con cero

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 4 de mayo de 2010 14:07
  • Creo que en el evento OnInitialized todavía no se cargan los UIElement de visualización.. proba en onload para probar o bien en otro evento, pero una vez que haya cargado.

    El tema es que después de que se realiza System.Windows.Application.LoadComponent(Me, New System.Uri("/Capacitacion.UI;component/Views/Archivo.xaml", System.UriKind.Relative)) se puede tomar los valores de visualización.

     

    saludos

    martes, 4 de mayo de 2010 14:29
  • Hola Leandro.

    No me referia a ese height. 

    ¿el tag <my:customPopup> es de un namespace 'my' y un control 'customPopup' que esta personalizado no?.

    ¿que tipo de control es customPopup?


    Saludos
    David González
    martes, 4 de mayo de 2010 17:39

  • ahh ok te referias a esto

     

    public class CustomPopUp : Popup

    {

    }

    como veras deriva de PopUp

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 4 de mayo de 2010 19:19
  • samArg,

    intente lo que comentas, pero justo ahi esta el problema no tengo un evento que represente el Load, si lo tuviera por ahi seria la solucion

    o por ahi alguno parecido, el unico que puedo ver es el OnInitialized

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 4 de mayo de 2010 19:23
  • Hola Leandro.

    entonces al final si que has creado algo parecido a un control de usuario, ya que estas heredando de Popup.

    ¿necesitas algo en especial que tenga esa clase?, lo comento por que lo ideal es crear con el contenido de CustomPopup un UserControl de modo que ahi puedas implementar la funcionalidad y apariencia, luego para usarlo se inserta dentro de un Popup normal en el xaml, de esta forma se encapsula un UserControl dentro de Popup el cual puedes personalizar como desees.

     

    No obstante, lo que ocurre en tu codigo es que el control aun no se ha renderizado, solo se ha inicializado con todas las propiedades del codigo xaml, de modo que solo puedes obtener su alto con la propiedad height, pero como esta puesta en Auto te va a devolver NAN, de modo que puedes obtener el height del grid o poner un valor en el alto del customPopup.

    Por otro lado la propiedad RenderSize.Height viene a ser la misma que actualHeitght, ya que ambas te dan el alto del control renderizado en pantalla, mientras que height te da el alto que tiene el control y es el unico que se puede modificar.


    Saludos
    David González
    miércoles, 5 de mayo de 2010 7:05