2010-01-10 40 views

Respuesta

81

Una forma posible sería para explorar la lista de ventanas abiertas en la aplicación y comprobar cuál de ellos tiene IsActive = true:

Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); 

No está seguro de si puede haber más de una ventana activa si, por ejemplo, , hay un cuadro de diálogo modal que muestra, en cuyo caso, el propietario del cuadro de diálogo y el cuadro de diálogo pueden estar activos.

+0

Al volver a mi antigua respuesta, podría ser mejor usar el operador 'OfType ()' en lugar del 'Cast ()' por si acaso ... –

+0

¡increíble! Esto me evita tener que pasar una referencia a la ventana, lo que mantiene mi estructura de datos libre de referencias de UI. ¡Gracias! – BrokeMyLegBiking

+5

Para hacerlo más robusto, también podría usar 'FirstOrDefault' en lugar de' SingleOrDefault', que arroja una excepción si hay varios elementos coincidentes. Además, debería ser un poco más rápido porque acepta el primer resultado y no necesita verificar que sea el único. – ygoe

19

Hay una forma mejor de hacerlo utilizando PInvoke. La respuesta de Aviads no funciona todo el tiempo (hay algunos casos de borde con diálogos).

IntPtr active = GetActiveWindow(); 

ActiveWindow = Application.Current.Windows.OfType<Window>() 
    .SingleOrDefault(window => new WindowInteropHelper(window).Handle == active); 

Uno debe incluir siguiente importación primera:

[DllImport("user32.dll")] 
static extern IntPtr GetActiveWindow(); 
+1

Hehe. Tardé algunas horas en descubrirlo yo mismo.De hecho, escribí exactamente lo mismo que usted y vine aquí a compartirlo, pero usted fue el primero, así que aquí está mi voto: P –

+6

¿puede explicarnos cuáles son los casos límite? – nchaud

+1

@nchaud Estoy utilizando AvalonDock, que le permite arrastrar un espacio de trabajo fuera de la ventana principal y hacia una nueva ventana. Sin embargo, estas ventanas también están marcadas como 'IsActive'. El uso de la otra solución arrojó una excepción (lanzamientos 'SingleOrDefault' si hay más de uno que coincida con el predicado) o no me dio la ventana activa real al usar' FirstOrDefault' – clcto

0

tengo problemas con esta forma "Application.Current.Windows.OfType() SingleOrDefault (x => x.IsActive);" Especialmente porque estaba construyendo una aplicación con una ventana principal, entonces tuve problemas cuando se seleccionó la ventana principal. Resuelvo que la creación de este:

En cierta clase base o App.xaml.cs crear esto:

 public static Window ActivatedWindow {get;set;} 

A continuación, poner en su ventana que deriva de la clase base o la totalidad de Activar Evento de su ventana:

primera opción - base de la Clase ventana personal:

 public class MetroToolWindowBase 
     { 
     public MetroToolWindowBase() 
     { 
      Activated += new EventHandler(MakeActive); 
     } 
     private void MakeActive(object sender, EventArgs e) 
     { 
     App.ActivatedWindow= this; 
     } 
     } 

Segunda Option- En Evento activada de Windows:

private void XWindow_Activated(object sender,EventArgs e) 
    { 
    App.ActivatedWindow= this; 
    } 
0

Sé que esta es una pregunta un poco vieja, pero creo que mi respuesta podría ayudar a alguien.

Mi problema era la siguiente: tuve una aplicación WPF MVVM y que necesitaba para obtener mi MainWindow ejemplo, en el segundo punto de vista, es decir, el segundo modelo de vista, con el fin de establecer la visibilidad del botón de la barra de título de visible.

Esta es mi solución:

MainWindow window = (MyApp.MainWindow)App.Current.MainWindow; 
window.btnSearch.Visibility = System.Windows.Visibility.Visible; 

la esperanza que esto ayudaría a alguien.

Cuestiones relacionadas