Come faccio a creare una finestra di dialogo modale per una pagina nella mia applicazione WPF?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Ho una finestra WPF che ha tra gli altri controlli un frame. In quella cornice visualizzo pagine diverse. C'è un modo per rendere una finestra di dialogo modale solo a una pagina? Quando visualizzo la finestra di dialogo, non dovrebbe essere possibile fare clic su alcun controllo nella pagina, ma dovrebbe essere possibile fare clic su un controllo nella stessa finestra che non si trova nella pagina.

È stato utile?

Soluzione

Se ho ragione nell'interpretare il tuo messaggio, vuoi qualcosa che funzioni in modo simile a cosa Billy Hollis dimostra nella sua applicazione StaffLynx .

Di recente ho creato un controllo simile e si scopre che questo tipo di idea è relativamente semplice da implementare in WPF. Ho creato un controllo personalizzato chiamato DialogPresenter. Nel modello di controllo per il controllo personalizzato, ho aggiunto un markup simile al seguente:

<ControlTemplate TargetType="{x:Type local=DialogPresenter}">
  <Grid>
    <ContentControl>
      <ContentPresenter />
    </ContentControl>
    <!-- The Rectangle is what simulates the modality -->
    <Rectangle x:Name="Overlay" Visibility="Collapsed" Opacity="0.4" Fill="LightGrey" />
    <Grid x:Name="Dialog" Visibility="Collapsed">
      <!-- The template for the dialog goes here (borders and such...) -->
      <ContentPresenter x:Name="PART_DialogView" />
    </Grid>
  </Grid>
  <ControlTemplate.Triggers>
    <!-- Triggers to change the visibility of the PART_DialogView and Overlay -->
  </ControlTemplate.Triggers>
</ControlTemplate>

Ho anche aggiunto un metodo Show (Control view) , che trova il 'PART_DialogView' e aggiunge la vista passata alla proprietà Content .

Questo mi permette quindi di usare DialogPresenter come segue:

<controls:DialogPresenter x:Name="DialogPresenter">
  <!-- Normal parent view content here -->
  <TextBlock>Hello World</TextBlock>
  <Button>Click Me!</Button>
</controls:DialogPresenter>

Al gestore degli eventi pulsanti (o comando associato), chiamo semplicemente il metodo Show () del DialogPresenter .

Puoi anche aggiungere facilmente il markup ScaleTransform al modello DialogPresenter per ottenere effetti di ridimensionamento mostrati nel video. Questa soluzione ha un codice di controllo personalizzato pulito e ordinato e un'interfaccia molto semplice per il tuo team di programmazione dell'interfaccia utente.

Spero che questo aiuti!

Altri suggerimenti

Ho un progetto su github che è un FrameworkElement personalizzato che ti consente di visualizzare contenuti modali sul contenuto principale.

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 contenuti arbitrari.
  • Non disabilita il contenuto principale mentre viene visualizzato il contenuto modale.
  • Disabilita l'accesso del mouse e della tastiera al contenuto principale mentre viene visualizzato il contenuto modale.
  • È solo modale al contenuto che copre, non all'intera applicazione.
  • può essere usato in modo MVVM vincolante per la proprietà IsModal .

Perché non usare semplicemente pump di messaggi nidificati per creare controlli modali

http://deanchalk.com/wpf-modal -Controllo-via-dispatcherframe-nested-message-pompe /

Non stai cercando una finestra di dialogo modale qui. Hai bisogno di una funzione che disabiliti la pagina " " controllare, mostrare una finestra di dialogo e riattivarla alla chiusura della finestra di dialogo.

Non sono troppo sicuro di capire cosa significhi fare una finestra di dialogo modale?

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