¿Cómo puedo hacer referencia a la ventana activa de la aplicación WPF en C#, usando algo como la propiedad ActiveForm en WinForms?Consulte la ventana activa en WPF?
Respuesta
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.
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();
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 –
¿puede explicarnos cuáles son los casos límite? – nchaud
@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
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;
}
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.
- 1. Establecer la ventana activa
- 2. Obtener la última ventana activa: Obtener Ventana previamente activa
- 3. Foreground Vs Ventana activa
- 4. ¿Cómo determinar si la ventana actual es la ventana activa?
- 5. Obtener texto resaltado de la ventana activa
- 6. Fondo personalizado para la ventana activa
- 7. Obteniendo el nombre de la ventana activa
- 8. ¿Por qué el evento descargado de la ventana no se activa en WPF?
- 9. WPF: ¿Cómo interactuar con la ventana inactiva?
- 10. Identificar de forma exclusiva la ventana activa en OS X
- 11. Obtiene el título actual de la ventana activa en Java
- 12. Capturar cambio en la ventana activa (para Linux)
- 13. CreateProcessAsUser Ventana de creación en la sesión activa
- 14. Obteniendo información de la ventana activa en Java
- 15. C# WPF - Línea negra en la ventana
- 16. Agregar WPF UserControl a la ventana WPF en el código
- 17. DispatcherTimer no se activa en la aplicación WPF
- 18. Application.Idle evento no se activa en la aplicación WPF
- 19. Ventana sin bordes en WPF
- 20. Página contra ventana en WPF?
- 21. Cómo recuperar el texto seleccionado de la ventana activa
- 22. Tener una ventana wpf dentro de otra ventana wpf
- 23. ¿Minimiza una ventana en WPF?
- 24. C# obtener información sobre la ventana activa actual
- 25. ¿Cómo obtener el título de la ventana activa con AutoHotKey?
- 26. Precarga de ventana WPF
- 27. WPF Ventana establecida Enfoque
- 28. WPF. Cómo ocultar/mostrar la ventana principal desde otra ventana
- 29. WPF ventana emergente
- 30. WPF - Expanda ventana a la izquierda
Al volver a mi antigua respuesta, podría ser mejor usar el operador 'OfType()' en lugar del 'Cast ()' por si acaso ... –
¡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
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