none
Como modificar atributos del "parent" RRS feed

  • Pregunta

  • Hola a todos,

    Tengo un MainWindow (con una grilla raiz), y un "user control". Dadas ciertas condiciones, este "UC" debe ser capaz de subir su <Z-Index> a un nivel mas alto. Lo he resuelto implementando un evento en el "UC" y una vez que el MainWindow a detectado dicho evento cambia el Z-Index del "UC" de la siguiente manera:

      Private Sub c3d3_Escena3d_MouseEnter() Handles c3d3.Escena3d_MouseEnter
        grid.SetZIndex(c3d3, 1)
      End Sub
    

    Pero la verdad estoy disconforme con esta solución, dado que lo ideal (para mi) es que el mismo "UC" pueda auto-elevar su Z-Index. Para ello, he intentado lo siguiente:

      Public Sub Scene3d_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Scene3d.MouseEnter
        '
        If AnimationStatus = AnimationStatusEnum.CardInAndCollapsed Then
    <strong>      Parent.SetValue(Grid.ZIndexProperty, 1)</strong>
          rotateInSb.Begin()
          RaiseEvent Escena3d_MouseEnter()
        End If
        '
      End Sub
    

    Pero la verdad es que no genero ningún resultado positivo. ¿ Alguien sabe como solucionar esto desde detro del UC ?

    De antemano muchas Gracias

    martes, 3 de agosto de 2010 14:42

Respuestas

  • Hola,

    Lo he resuelto con una pequeña sutileza. Lo estaba inetntando asi:

    Me.Parent.SetValue(System.Windows.Controls.Grid.ZIndexProperty, 1)
    

    El problema es que esto cambia el z-index "DEL PADRE" no el z-Index del hijo Respecto del padre. Lo correcto es asi:

    Me.SetValue(System.Windows.Controls.Grid.ZIndexProperty, 1)
    

    Esto Modifica el atributo de Z-Index del hijo respecto del Padre, pero desde dentro del hijo mismo. Que era lo que precisamente andaba buscando.

    Saludos

    Y gracias a Corsario por sus aportes

     

    • Marcado como respuesta nelson.nelis miércoles, 4 de agosto de 2010 17:26
    miércoles, 4 de agosto de 2010 17:26

Todas las respuestas

  • ¡Hola!

    Prueba en vez de un grid con un canvas. Me falta código por tu parte pero a ver si podemos hacer algo...

     Private Sub c3d3_Escena3d_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles c3d3.Escena3d_MouseEnter
     
      End Sub

    Debes de verificar que objeto recoge el sender. Y si con un parent llegas hasta el canvas. Si no es así debes de encontrar la manera de llegar a él. En este foro, tanto David como yo, explicamos la manera de hacerlo. Él en C#, yo en VB.net.

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/7f2fded3-e6c8-4a6f-bf89-49a03e19fa56

    En líneas generales te valdría (VB.net):

    Dim Canv = CType(GetChildObject(Of Canvas)(sender, "c3d3"), Canvas). Si c3d3 es el nombre del elemento padre buscado.

    GetChildObject es la función descrita en el foro que te he adjuntado.

    Y a ese Canv puedes modificar sus propiedades como quieras.

    Espero haberte ayudado. Un saludo.

    martes, 3 de agosto de 2010 15:03
  • ¡Hola!

    Prueba en vez de un grid con un canvas. Me falta código por tu parte pero a ver si podemos hacer algo...

     Private Sub c3d3_Escena3d_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles c3d3.Escena3d_MouseEnter
     
      End Sub

    Debes de verificar que objeto recoge el sender. Y si con un parent llegas hasta el canvas. Si no es así debes de encontrar la manera de llegar a él. En este foro, tanto David como yo, explicamos la manera de hacerlo. Él en C#, yo en VB.net.

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/7f2fded3-e6c8-4a6f-bf89-49a03e19fa56

    En líneas generales te valdría (VB.net):

    Dim Canv = CType(GetChildObject(Of Canvas)(sender, "c3d3"), Canvas). Si c3d3 es el nombre del elemento padre buscado.

    GetChildObject es la función descrita en el foro que te he adjuntado.

    Y a ese Canv puedes modificar sus propiedades como quieras.

    Espero haberte ayudado. Un saludo.

     

    Disculpa amigo, pero creo que entendiste mal ... o en realidad pude haberme expresado mal.

     

    El caso es que tengo un mainWindows que tiene una Grilla llama "grid". Tengo una UserControl llamado "c3d3". Cuando en el "mainWindow", yo escribo lo siguiente:

    Class MainWindow
     '
     Private WithEvents c3d3 As Card3d
     '
     Public Sub New()
      '
      ' This call is required by the designer.
      InitializeComponent()
      '
      ' Add any initialization after the InitializeComponent() call.
      '
      grid.Children.Add(c3d3)
      '
     End Sub
     '
     Private Sub c3d3_Escena3d_MouseEnter() Handles c3d3.Escena3d_MouseEnter
      grid.SetZIndex(c3d3, 1)
     End Sub
     '
    End Class
    '
    

    En la instrucción < grid.SetZIndex(c3d3, 1) > hago que el objeto "c3d3" (que es hijo de la grilla principal) pase a z-Index = 1 ,  es decir, se posiciona en cima de todos los otros hijos. Esto si funciona.

     

    El tema es que quiero hacer eso pero desde dentro del "UC". Lo que quise mencionar es que intente "desde dentro del control mismo" la siguiente instruccion:

     

     '
     '
     Parent.SetValue(Grid.ZIndexProperty, 1)
     '
     '
    

     

    Pero no dio resultados (tampoco arrojo errores). Mi duda no es si el canvas es mejor que el grid en esto del zindex.

    Mi duda es como hago para hacer lo que ya pude hacer (o sea cambiar el z-index de un hijo de la grilla principal) pero desde dentro de este hijo (que es un User Control), seria como lo siguiente: "Como hago para cambiar el z-index de mi mismo en mi padre, pero desde mi mismo" donde mismo es el user control. Suena medio "rimbombante" pero es para dejar bien en claro la duda.

    Espero haberme podido expresar mejor.

    Gracias

    • Editado nelson.nelis martes, 3 de agosto de 2010 16:26 especificaciones
    martes, 3 de agosto de 2010 16:12
  • Ok, ahora te entiendo mejor. ;-).

    En mi modesta opinión, te falta un constructor (new) en la instancia de  Private WithEvents c3d3 As Card3d. En un principio, no creo que sea necesario poner un WithEvents cuando por defecto un control de usuario viene con disparador de eventos. Eso a tu elección que desde aqui no se ve cómo es Card3d ;-).

    Podrías sobrecargarlo y pasar el objeto padre directamente al instanciarlo. Y en el new del Card3d realizar la atribución de indices que deseas.

    Una buena práctica sería en tu control de usuario Card3d poner un nuevo new:

    Friend Sub New(Byval nPadre as Grid)

    Try

    'Instanciamos el new original

    Me.New()

    'Tu código

    Ctype(nPadre, Grid).SetZIndex(c3d3, 1)

    Catch ex As Exception

    Er(ex)

     

     

    End Try

    End sub

    Extraño que no te funcione el parent. Verifica por favor cuando haces: Parent.SetValue(Grid.ZIndexProperty, 1) cuál es tu verdadero objeto Grid y cuál es su verdadero Parent.

    Otra cosa que deberías de comprobar es que si durante tu ejecución del código no existe otro control que una vez que has asignado esa posición deseada, no vuelva a posicionar tu control en otra posición.

    También puedes contemplar, en vez de sobrecargar el contructor de generarte una propiedad.

    Espero haberte ayudado. Un saludo.

    miércoles, 4 de agosto de 2010 7:54
  • Hola,

    Lo he resuelto con una pequeña sutileza. Lo estaba inetntando asi:

    Me.Parent.SetValue(System.Windows.Controls.Grid.ZIndexProperty, 1)
    

    El problema es que esto cambia el z-index "DEL PADRE" no el z-Index del hijo Respecto del padre. Lo correcto es asi:

    Me.SetValue(System.Windows.Controls.Grid.ZIndexProperty, 1)
    

    Esto Modifica el atributo de Z-Index del hijo respecto del Padre, pero desde dentro del hijo mismo. Que era lo que precisamente andaba buscando.

    Saludos

    Y gracias a Corsario por sus aportes

     

    • Marcado como respuesta nelson.nelis miércoles, 4 de agosto de 2010 17:26
    miércoles, 4 de agosto de 2010 17:26