Come disattivare gli eventi di tastiera e mouse in una parte della struttura ad albero visuale senza usare IsEnabled?

StackOverflow https://stackoverflow.com/questions/1113518

  •  12-09-2019
  •  | 
  •  

Domanda

Ho l'esigenza di costruire dialoghi pseudo-modale in WPF. Cioè, per alcuni specifici motivi (tecnici) il software non è autorizzato a deporre le uova finestre di dialogo modali. Al contrario, l'utente dovrebbe interagire con le finestre di dialogo modali "embedded" in caso di necessità.

ho trovato una soluzione che funziona abbastanza bene con MVVM e si prende cura del Dispatcher e il carattere sincrono di finestre di dialogo modali. Tuttavia, sto affrontando un problema con la disattivazione l'input dell'utente in background GUI. Impostare tutti i controlli per IsEnabled = false è, purtroppo, non accettabile in quanto cambia lo stato visivo dei controlli di fondo (sfumature di grigio -> cattiva leggibilità).

C'è un modo dritto in avanti per disattivare l'input dell'utente (tra cui messa a fuoco e tastiera) in background senza modificare lo stato visivo?

Grazie per il vostro aiuto!

È stato utile?

Soluzione

Ho un progetto su github che fornisce un FrameworkElement personalizzato che consente di visualizzare il contenuto modale su il contenuto primario.

Il controllo può essere utilizzato in questo modo:

<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}">
    <TabControl Margin="5">
            <Button Margin="55"
                    Padding="10"
                    Command="{Binding ShowModalContentCommand}">
                This is the primary Content
            </Button>
        </TabItem>
    </TabControl>

    <c:ModalContentPresenter.ModalContent>
        <Button Margin="75"
                Padding="50"
                Command="{Binding HideModalContentCommand}">
            This is the modal content
        </Button>
    </c:ModalContentPresenter.ModalContent>

</c:ModalContentPresenter>

Caratteristiche:

  • Visualizza il contenuto arbitrario.
  • Non disattivare il contenuto primario, mentre si sta visualizzando il contenuto modale.
  • Disabilita mouse e tastiera accesso al contenuto primario, mentre viene visualizzato il contenuto modale.
  • è modale solo al contenuto che copre, non l'intera applicazione.
  • può essere utilizzata in un modo amichevole MVVM legandosi alla proprietà IsModal.

Altri suggerimenti

È possibile impostare la proprietà .IsHitTestVisible per disabilitare eventuali clic del mouse per il controllo / finestra. Questo funziona come impostazioni .IsEnabled, ma senza il cambiamento di stato visivo (controlli di grigio).

Sono stato alle prese con lo stesso problema (anche MVVM). Sto anche utilizzando una sovrapposizione UserControl al posto di un popup modale. (Nel mio caso, non mi piace IsEnabled = false non a causa dello stile disabili, ma perché commutando IsEnabled rende difficile ottenere la tastiera concentrarsi di nuovo).

Sto utilizzando la soluzione di sovrapposizione (sopra) per bloccare l'azione del mouse. E per "l'altra metà della soluzione" - input da tastiera -disabling - sto consegnando questo nella finestra principale:

Window
+----------------+  private void Window_PreviewKeyDown(object sender,
|                |                                     KeyEventArgs e){
|  Transparent   |      if (this.myDialog.Visibility == Visibility.Visible){
|                |          e.Handled = true;
|  +----------+  |      }
|  | myDialog |  |  }
|  | content  |  |
|  +----------+  |
|                |
+----------------+

Una soluzione parziale potrebbe essere quello di rendere il vostro controllo "dialogo" coprire l'intera finestra dell'applicazione, ma hanno la maggior parte di esso essere trasparente, con un contenuto di dialogo opaco in mezzo, come:

+----------------+
|                |
|  Transparent   |
|                |
|  +----------+  |
|  | dialog   |  |
|  | content  |  |
|  +----------+  |
|                |
+----------------+

Ma, che è un po 'di hack.

Per rispondere direttamente alla tua domanda, è possibile utilizzare un trigger sulla proprietà IsEnabled sui vostri controlli per mantenere i colori da cambiare. Forse qualcuno con Visual Studio sulla loro scatola in grado di fornire un esempio di codice. :)

Risposta al tuo commento:

Temo che questa risposta è sempre un po 'complicato, ma è possibile impostare l'IsTabStop e le proprietà Focusable false sui vostri controlli per ottenere che il comportamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top