Question

J'ai une fenêtre WPF qui, parmi d'autres contrôles, héberge un cadre. Dans ce cadre, j'affiche différentes pages. Est-il possible de rendre un dialogue modal pour une page seulement? Lorsque je montre la boîte de dialogue, il ne devrait pas être possible de cliquer sur un contrôle de la page, mais il devrait être possible de cliquer sur un contrôle de la même fenêtre qui ne se trouve pas sur la page.

Était-ce utile?

La solution

Si j’interprète correctement votre message, vous voulez quelque chose qui fonctionne de la même manière que ce Billy Hollis fait une démonstration dans son application StaffLynx .

J'ai récemment construit un contrôle similaire et il s'est avéré que ce genre d'idée est relativement simple à implémenter dans WPF. J'ai créé un contrôle personnalisé appelé DialogPresenter. Dans le modèle de contrôle du contrôle personnalisé, j'ai ajouté un balisage semblable à celui-ci:

<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>

J'ai également ajouté une méthode Show (Control view) , qui trouve la 'PART_DialogView' et ajoute la vue transmise à la propriété Content .

Ceci me permet alors d’utiliser le DialogPresenter comme suit:

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

Au gestionnaire d'événement de boutons (ou à la commande liée), j'appelle simplement la méthode Show () du DialogPresenter .

Vous pouvez également facilement ajouter un balisage ScaleTransform au modèle DialogPresenter pour que les effets de mise à l’échelle apparaissent dans la vidéo. Cette solution possède un code de contrôle personnalisé soigné et ordonné, ainsi qu'une interface très simple pour votre équipe de programmation d'interface utilisateur.

J'espère que ça aide!

Autres conseils

J'ai un projet sur github , qui est un FrameworkElement personnalisé. vous permet d’afficher du contenu modal sur le contenu principal.

Le contrôle peut être utilisé comme ceci:

<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>

Caractéristiques:

  • Affiche un contenu arbitraire.
  • Ne désactive pas le contenu principal pendant l'affichage du contenu modal.
  • Désactive l'accès de la souris et du clavier au contenu principal pendant l'affichage du contenu modal.
  • N’est modal que pour le contenu qu’il couvre, pas pour l’application entière.
  • peut être utilisé de manière conviviale sur MVVM en liant la propriété IsModal .

Pourquoi ne pas utiliser des pompes de messages imbriquées pour créer des contrôles modaux

http://deanchalk.com/wpf-modal -controls-via-dispatcherframe-nested-message-pumps /

Vous ne recherchez pas de dialogue modal ici. Vous avez besoin d’une fonction qui désactivera la " page " contrôler, afficher une boîte de dialogue et la réactiver à la fermeture de la boîte de dialogue.

Je ne sais pas trop si vous comprenez ce qu'un dialogue modal est censé faire?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top