2010-03-06 33 views
7

Mi aplicación tiene un icono de bandeja que, cuando se hace doble clic, oculta o muestra la ventana de la aplicación. Mi problema es que parece que no puedo poner la ventana en primer plano si estaba en un estado minimizado cuando estaba oculta.WPF: la ventana se mantiene minimizada incluso cuando se establece WindowState explícitamente

Por ejemplo, supongamos que el usuario minimiza la aplicación y luego hace doble clic en el icono de la bandeja. La ventana de la aplicación se oculta y desaparece de la barra de tareas. Cuando el usuario vuelve a hacer doble clic en el icono de la bandeja, debe aparecer la ventana de la aplicación, es decir, debe restaurarse desde el estado minimizado y ponerse en primer plano.

El siguiente código debe de hacer eso, pero por alguna razón no lo hace:

private void TrayIcon_DoubleClick(object sender, EventArgs e) 
{ 
    if (this.Visibility == Visibility.Hidden) 
    { 
     this.Visibility = Visibility.Visible; 
     this.WindowState = WindowState.Normal; 
     this.Activate(); 
    } 
    ... 
} 

La aplicación permanece minimizado y que no se ponga el primer plano. activar() devuelve true y las posteriores llamadas a TrayIcon_DoubleClick() indican que el estado es, en efecto establece en normal.

Respuesta

12

Publiqué mi pregunta en los foros de MSDN y it got answered there. Para citar la respuesta:


Algunas propiedades en la ventana que se parecen más a métodos, en el sentido de que causen acciones complejas que ocurren, es necesario que ocurra después de la acción anterior ya se ha completado. Una forma de conseguir que eso suceda es usando Dispatcher.BeginInvoke. Si cambia su código para que se vea así, debería funcionar:

if (this.Visibility == Visibility.Hidden) 
{ 
    this.Visibility = Visibility.Visible; 
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, 
     new Action(delegate() 
     { 
      this.WindowState = WindowState.Normal; 
      this.Activate(); 
     }) 
    ); 
} 

Lo probé y solucionó el problema. Además, creo que también puedes omitir el this.Activate().

+5

Ok, eso soluciona el problema pero eso apesta ¿no crees? Quiero decir, ¿cómo se supone que debes saber cuándo puedes usar una propiedad o no? Encuentro esto muy extraño ... –

1

Encontré una mejor manera. Como el problema ocurre cuando cambio la visibilidad de la ventana y el estado de la ventana, lo que hago es cambiar la propiedad ShowInTaskBar en lugar de Visibility. De todos modos, una ventana minimizada con ShowInTaskBar = true es como una ventana oculta.

0

Desde la perspectiva del usuario Haga clic en el icono minimizado Esto debería mostrar una lista de todas las instancias de la aplicación. haga clic derecho en un miembro de esta lista seleccione maximizar. Nota: al hacer clic con el botón secundario en el icono minimizado aparecerá un menú con la opción Cerrar. Para obtener la opción Maximizar, debe hacer clic con el botón derecho en la lista que aparece al hacer clic en el icono.

Cuestiones relacionadas