2012-04-24 9 views
8

Ho un controllo che utilizza un popup con alcuni controlli WPF al suo interno e StaysOpen = "True". Il problema è quando si fa clic sul popup quando l'applicazione non ha lo stato attivo, l'applicazione non riceve lo stato attivo. Ho fatto un po 'di ricerche, e sembra che questo potrebbe essere dovuto al fatto che i popup sono pensati per essere usati per i menu, quindi non hanno tutti i gestori di messaggi Windows appropriati collegati. Ecco un esempio barebone per provare le canzoni del problema:WPF Popup non causa la messa a fuoco dell'applicazione quando si fa clic su

<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. eseguire l'applicazione.
  2. Interagire con la casella di riepilogo, che dovrebbe funzionare correttamente.
  3. Passare a un'altra applicazione.
  4. Fare clic sulla casella di riepilogo mentre l'applicazione non è attiva. Non succede nulla
  5. Fare clic sull'applicazione all'esterno della casella di riepilogo.
  6. Fare clic sulla casella di riepilogo. Funziona ora.

Quello che mi aspetto di accadere nel passaggio 4 sarebbe che l'applicazione avrebbe ricevuto lo stato attivo e la casella di riepilogo selezionerebbe il nuovo elemento.

Esistono soluzioni alternative a questo problema o qualcosa di ovvio mi manca? Sto cercando di riscrivere l'intero codice popup con finestre a tutti gli effetti, e di ri-implementare il comportamento che abbiamo, ma questo sembra davvero complicato solo per risolvere un piccolo problema come questo.

risposta

4

Se si gestisce l'evento MouseLeftButtonDown, è possibile chiamare il metodo Window.Activate(). ma dovresti scriverlo per ogni elemento - Popup e per tutti gli TextBlock s.

Il problema che si può incontrare è che su Windows è possibile scambiare i pulsanti del mouse, dove a sinistra è diventato giusto e viceversa (ma non so come funziona), quindi, potrebbe essere necessario gestire l'evento MouseRightButtonDown.

+3

Dovrebbe essere sufficiente utilizzare gli eventi del mouse Anteprima ... per intercettarlo sul pop-up senza dover aggiungere altri gestori per il suo contenuto. – Paul

+0

Ha funzionato usando PreviewXXX per me. – FryGuy

+0

Ragazzi, siete più specifici riguardo all'anteprima? Mi sembra di avere lo stesso problema. –

Problemi correlati