2012-04-24 14 views
8

Tengo un control que está utilizando una ventana emergente con algunos controles WPF dentro de ella, y StaysOpen = "True". El problema es cuando al hacer clic en la ventana emergente cuando la aplicación no tiene foco, la aplicación no recibe el foco. He investigado un poco, y parece que esto puede deberse al hecho de que los pop-ups están destinados a ser utilizados para menús, por lo que no tienen todos los manejadores de mensajes de Windows correctos conectados. Este es un ejemplo de barebones a demoing el problema:WPF Popup no provoca que la aplicación se enfoque al hacer clic en

<Window x:Class="TestWindowPopupBehavior.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:TestWindowPopupBehavior="clr-namespace:TestWindowPopupBehavior" Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Popup StaysOpen="True" IsOpen="True" Placement="Center"> 
     <ListBox> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
     </ListBox> 
    </Popup> 

</Grid> 
</Window> 
  1. ejecutar la aplicación.
  2. Interactúe con el cuadro de lista, que debería funcionar bien.
  3. Cambie a otra aplicación.
  4. Haga clic en el cuadro de lista mientras la aplicación no está activa. No pasa nada
  5. Haga clic en la aplicación fuera del cuadro de lista.
  6. Haga clic en el cuadro de lista. Está trabajando ahora.

Lo que esperaría que sucediera en el paso 4 sería que la aplicación recibiría el foco, y el cuadro de lista seleccionaría el nuevo elemento.

¿Hay alguna solución a este problema, o algo obvio que me falta? Estoy buscando reescribir todo el código emergente con ventanas de pleno derecho y volver a implementar el comportamiento que tenemos, pero eso parece realmente complicado solo para solucionar un pequeño problema como este.

Respuesta

4

Si maneja el evento MouseLeftButtonDown, puede llamar al método Window.Activate(). pero debe escribirlo para cada elemento: Popup y para todos los TextBlock s.

El problema que puede encontrar es que en Windows puede cambiar los botones del mouse, donde se hizo a la derecha y viceversa (pero no sé cómo funciona), entonces puede ser que tenga que manejar el evento MouseRightButtonDown.

+3

Debería ser suficiente utilizar los eventos del mouse Preview ... para atraparlo en la ventana emergente sin tener que agregar más controladores para su contenido. – Paul

+0

Funcionó usando PreviewXXX para mí. – FryGuy

+0

¿Pueden ser más específicos acerca de la vista previa? Parece que estoy teniendo el mismo problema. –

Cuestiones relacionadas