2012-07-28 69 views

Respuesta

5

Su mejor opción sería la creación de una propiedad en la ventana que B pasas la ventana de creación a. Algo como esto. Tengo una ventana llamada MainWindow y una segunda ventana llamada Window2.

ventana principal

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     Window2 secondForm; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      secondForm = new Window2(); 
      secondForm.setCreatingForm =this; 
      secondForm.Show(); 
     } 
    } 
} 

Window2

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window2.xaml 
    /// </summary> 
    public partial class Window2 : Window 
    { 
     Window creatingForm; 

     public Window2() 
     { 
      InitializeComponent(); 
     } 

     public Window setCreatingForm 
     { 
      get { return creatingForm; } 
      set { creatingForm = value; } 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      if (creatingForm != null) 
       creatingForm.Close(); 

     } 

    } 
} 

En respose a su comentario, el cierre de una ventana que se creó por otra forma es tan fácil como llamar a la Cerrar Método de la forma creada:

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     Window2 secondForm; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      if (secondForm == null) 
      { 
       secondForm = new Window2(); 
       secondForm.Show(); 
      } 
      else 
       secondForm.Activate(); 
     } 

     private void button2_Click(object sender, RoutedEventArgs e) 
     { 
      if (secondForm != null) 
      { 
       secondForm.Close(); 
       secondForm = new Window2(); 
       //How ever you are passing information to the secondWindow 
       secondForm.Show(); 
      } 

     } 
    } 
} 

+0

: - Buen trabajo. En realidad, quiero cerrar Window2 desde MainWindow. Gracias por adelantado. –

+0

@AnoopMohan Cerrar un formulario por el formulario que lo creó es mucho más fácil, solo tiene que mantener la referencia al formulario creado y llamar al método Cerrar en él. –

+0

: - Gracias, señor. . Ahora puedo cerrar la ventana. Pero necesito hacer una cosa más ...Quiero cerrar la ventana y abrir la misma ventana con diferente valor durante el mismo evento. Perdón por molestarte. . Gracias por adelantado. . –

1

es muy sencillo hacer una clase pública y método como este

class Helper 
{ 
public static void CloseWindow(Window x) 
    { 
     Assembly currentAssembly = Assembly.GetExecutingAssembly(); 
     // int count = Application.Current.Windows; 
     foreach (Window w in Application.Current.Windows) 
     { 
      //Form f = Application.OpenForms[i]; 
      if (w.GetType().Assembly == currentAssembly && w==x) 
      { 
       w.Close(); 
      } 
     } 
    } 
} 

ahora llamar a esta función desde la que desea cerrar la ventana como esta.

Helper.CloseWindow(win);//win is object of window which you want to close. 

Espero que esto ayude.

2

Aquí hay una manera de cerrar cualquier ventana desde cualquier otra ventana. Puede modificarlo para que funcione con varias instancias al darle a su ventana un identificador único y luego solo buscarlo en el ciclo foreach.

public static class Helper 
{ 
    public static void CloseWindowOfWhichThereIsOnlyOne<T>() 
    { 
     Assembly currentAssembly = Assembly.GetExecutingAssembly(); 
     foreach (Window w in Application.Current.Windows) 
     { 
      if (w.GetType().Assembly == currentAssembly && w is T) 
      { 
       w.Close(); 
       break; 
      } 
     } 
    } 
} 

O con un identificador "fudge" único:

public static void CloseWIndowUsingIdentifier(string windowTag) 
    { 
     Assembly currentAssembly = Assembly.GetExecutingAssembly(); 
     foreach (Window w in Application.Current.Windows) 
     { 
      if (w.GetType().Assembly == currentAssembly && w.Tag.Equals(windowTag)) 
      { 
       w.Close(); 
       break; 
      } 
     } 
    } 

me gusta esto mejor que la solución propuesta, ya que no tiene que meterse con sus ventanas, que no sea para darles etiquetas únicas . Solo he estado usando esto para proyectos pequeños donde no existe el riesgo de que las cosas no sean únicas, ¡no voy a perder la pista de 10-12 ventanas!

La otra solución propuesta es un poco tonto (no tengo 50 karma para comentar acerca de eso) ya que sólo podría llamar win.close() si ya tenía una referencia al objeto ...

0
 foreach (Window w in Application.Current.Windows) 
     { 
      if (w.Name != "Main_Window_wind") 
      { 
       w.Visibility = System.Windows.Visibility.Hidden; 
      } 
     } 
//name is the x:Name="Main_Window_wind" in xaml 

puede cerrar ahora como hiden todas las ventanas sin cerrar la llamada Main_Window_wind, puede agregar otra ventana para no cerrar con esto en si:!! w.Name = "Main_Window_wind" & & w.Name = "AnyOther_Window_wind" & & ...

una manera más rápida es esto:

 for (int intCounter = App.Current.Windows.Count - 1; intCounter > -1; intCounter--) 
     { 

      if (App.Current.Windows[intCounter].Name != "Main_Window_wind") 
       App.Current.Windows[intCounter].Visibility = System.Windows.Visibility.Hidden; 
     } 
+2

Agregue algunos comentarios sobre su solución sobre por qué y cómo resuelve el problema –

Cuestiones relacionadas