entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Como puedo ocultar una ventana WPF desde otra ventana WPF con VB2010

Si estoy en la misma ventana si puedo esconder con Me.Hide(), pero si abro otra ventana con un boton y coloco.

Dim Ventana As New VentanaAnterior
Ventana.Hide

el codigo ejecuta sin errores, pero la ventana anterior sigue visible.

0voto

mrczrt comentado

Hola que tal, podrias poner la definicion de VentanaAnterior? es public? saludos.

4 Respuestas

1voto

Guidex Puntos1010

Lo prometido, aquí esta la forma de cerrar una ventana desde otra ventana WFP.

El codigo de la primera ventana.

Class MainWindow 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim Ventana As New Window1
    Ventana.Owner = Me
    Ventana.Show()
End Sub

End Class

El codigo de la segunda ventana que ocultara la primera ventana (si desean cerrar solo cambien la palabra Hide por la palabra Close).

Public Class Window1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim VentPrincipal As MainWindow
    VentPrincipal = Me.Owner
    VentPrincipal.Hide()
End Sub

End Class

Eso es todo, nuevamente gracias a todos los que se preocupan por ayudar a los que sabemos menos, algún día sabremos más.

Lo explicado, con imágenes

1voto

Puntos0

¿Por qué no le pasas una referencia a la ventana anterior en su constructor? Así desde la nueva ventana ya podrás llamar a su método hide.

-1voto

Guidex comentado

Hice muchas cosas y nada, se me acabaron las ideas, coloco el código fuente demo en este enlace https://drive.google.com/file/d/0B6ymHkTGE2LKUTFuRUtJdW83RDg/edit?usp=sharing (clic en archivo y despues en descarga), si alguien pudiera corregirlo, voy a agradecerlo mucho.

Parece una burradita, pero estas cositas son la que me matan y no problemas complicados.

0voto

anónimo comentado

Hombre... nadie te va hacer al trabajo. Indica qué has probado y cómo para que te podamos ayudar. No puedes pretender que alguien se baje el código y te lo solucione.

¿Has probado lo que te comentaba en mi respuesta anterior? ¿Tienes algún problema con los conceptos? Así te podremos ayudar, no diciendo "ahí está el código, el que me lo solucione gracias"

0voto

Guidex comentado

Victor, la demo que coloque a lo mucho tendrá 6 o 7 lineas de código, no es que me lo hagan, es para que puedan ver todo el proceso, que a veces con palabras sería largo de explicar. Y si he probado tu respuesta, no funciona, también he creado un proceso dentro de la primera ventana y lo llame desde la segunda ventana, tampoco funciona, probé llamar desde una clase, tampoco funciona, como veras he probado de varias formas.

0voto

anónimo comentado

¿Puedes por favor pegar aquí código que ejemplifique lo que has probado? ¿Y comprobar que al pasar una instancia por referencia a otra la primera recibe las llamadas desde la segunda sin problemas?

0voto

Guidex Puntos1010

Bueno aquí va el código utilizado.

de la ventana 1 o ventana principal
XAML

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="278" Width="377">
<Grid>
    <Button Content="Ocultar Ventana" Height="53" HorizontalAlignment="Left" Margin="123,43,0,0" Name="Button1" VerticalAlignment="Top" Width="106">
    <Button Content="Nueva Ventana" Height="53" HorizontalAlignment="Left" Margin="123,122,0,0" Name="Button2" VerticalAlignment="Top" Width="106">
</Grid></Window>

El codigo

Class MainWindow 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Me.Hide()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
    Dim Ventana As New Window1
    Ventana.Show()
End Sub

Public Sub ocultar()
    Me.Hide()
End Sub               End Class

Ventana 1 con un boton que tiene que ocultar la ventana principal
XAML

<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300">
<Grid>
    <Button Content="Ocultar Ventana Anterior" Height="58" HorizontalAlignment="Left" Margin="71,88,0,0" Name="Button1" VerticalAlignment="Top" Width="153">
</Grid></Window>

El codigo

Public Class Window1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim VentanaAnterior As New MainWindow
    VentanaAnterior.ocultar()
End Sub             End Class

Como veras, estoy referenciando a la ventana principal, y estoy tratando de ejecutar un procedimiento llamado ocultar.

0voto

anónimo comentado

Mmmm... lo que veo es que estás creando una instancia nueva de MainWindow llamada VentanaAnterior... no usando una referencia a la instancia que ya tengas mostrándose ;)

Por si no se entiende: referencia != nueva instancia.

0voto

Guidex comentado

Si solo lo referencias sin instanciar es peor, a la primera ya te da un error que no has instanciado el objeto.

Si hay algo estoy haciendo mal, de como referenciar sin instanciar, agradezco que me puedas ayudar.

0voto

anónimo comentado

Busca las diferencias entre pasar un argumento por valor o por referencia y revisa mi primer post.

Constructores en VB
ByRef reference
ByVal vs ByRef

0voto

Guidex comentado

Se cuales son las diferencias entre pasar argumentos por valor y referencia, pero en este caso no paso ningún argumento, solo llamo a un procedimiento, de todas maneras le daré un ojo a los constructores.

0voto

anónimo comentado

Claro, ese es el tema. Si al constructor de Window1 le pasas una referencia a la ventana que lo crea, desde dentro de Window1 ya podrás ocultarlo.

Si no quieres hacerlo por constructor para que no sea una composición, crea una propiedad del tipo MainWindow y la seteas a la instancia que te interesa ocultar.

El objetivo es tener una referencia al MainWindow original. No una instancia nueva, ni una copia: una referencia al original.

Me estás empezando a hacer dudar porque hace muchos años que no toco VB... pero de verdad, en cualquier lenguaje se debe de poder hacer (de entre otras muchas y mejores formas) como te comento.

0voto

Guidex comentado

Bueno, retomando la situación (mucho trabajillo), trate de aplicar los constructores, pero no se pudo, porque solo se pueden aplicar a clases, y referente a la propiedad de tipo MainWindows tampoco funciono, ya que el momento de ejecutar me pide que instancie el objeto.

Estoy como al principio.

1voto

Puntos0

A ver si con código me hago entender por fin (revisa la sintaxis porque está escrito aquí directamente):

Public Class Window1

// Propiedad para guardar la referencia a MainWindow
Private parent as MainWindow

Public Sub New(ByRef parent as MainWindow)
  Me.parent = parent
end Sub

Private Sub Button1_Click(ByVal sender As System.Object, 
                          ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
  // Aquí usas la referencia que tienes guardada en la propiedad
  Me.parent.ocultar()
End Sub             

End Class

Y desde MainWindow al instancar Window1 le pasas MainWindow.

Class MainWindow 
Private Sub Button1_Click(ByVal sender As System.Object, 
                          ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

  Me.Hide()

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, 
                          ByVal e As  System.Windows.RoutedEventArgs) Handles Button2.Click

  Dim Ventana As New Window1(Me)
  Ventana.Show()

End Sub

Public Sub ocultar()

  Me.Hide()

End Sub               

End Class

0voto

Guidex comentado

Gracias Victor por tu esfuerzo, pero lo único que puedo decir que muchas cosas que funcionan en C#, que aparentemente deberían funcionar en VB... no funcionan, peor si esta combinado con ventanas WPF que no son tan iguales a los Formularios.

Aplique tu código, para que no digan que me voy a lo fácil, me arrojo una advertencia, pero si corre, lastimosamente en vez de abrir la ventana1, crea una nueva ventana1 sin ningún control dentro como un boton que me permita llamar a la ventana principal.

Este es el link de la captura , pero como dije agradezco el esfuerzo.

Ya lo habia resuelto el día de ayer, y lo publicare mañana, para el que lo necesite si alguna vez le ocurre lo mismo.

Gracias Victor, y no dejes de colaborar.

Guidex.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta