2008-10-06 14 views
24

Ich habe ein WPF-Fenster, das unter anderem einen Frame hostet. In diesem Frame zeige ich verschiedene Seiten an. Gibt es eine Möglichkeit, einen Dialog nur für eine Seite zu erstellen? Wenn ich den Dialog zeige, sollte es nicht möglich sein, auf ein Steuerelement auf der Seite zu klicken, aber es sollte möglich sein, auf ein Steuerelement in demselben Fenster zu klicken, das sich nicht auf der Seite befindet.Wie mache ich den modalen Dialog für eine Seite in meiner WPF-Anwendung?

Antwort

25

Wenn ich bei der Interpretation Ihrer Nachricht richtig bin, möchten Sie etwas, das ähnlich wie Billy Hollis demonstrates in his StaffLynx application funktioniert.

Ich habe vor kurzem ein ähnliches Steuerelement erstellt und es stellt sich heraus, dass diese Art von Idee in WPF relativ einfach zu implementieren ist. Ich habe ein benutzerdefiniertes Steuerelement namens DialogPresenter erstellt. In der Steuervorlage für die individuelle Steuerung, fügte ich Markup ähnlich dem folgenden:

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

ich auch eine Show(Control view) Methode hinzugefügt, die die die ‚PART_DialogView‘ findet, und die im Hinblick auf die Content Eigenschaft übergeben hinzufügt.

Dies ermöglicht dann mir die DialogPresenter wie folgt zu verwenden:

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

Zum Tasten Ereignishandler (oder gebundenen Befehl), rufe ich einfach die Show() -Methode der DialogPresenter.

Sie können ScaleTransform-Markup auch problemlos zur DialogPresenter-Vorlage hinzufügen, um Skalierungseffekte im Video anzuzeigen. Diese Lösung hat einen benutzerfreundlichen Kontrollcode und eine sehr einfache Schnittstelle für Ihr UI-Programmierteam.

Hoffe, das hilft!

+0

Ja, ich habe die Idee von der Anwendung StaffLynx bekommen. Ich finde es wirklich schwer, dieses WPF-Zeug zu finden, aber ich denke, es wird einfacher werden. Um den Dialog bewegbar zu machen, denke ich, dass noch einige Dinge erledigt werden müssen. –

+0

Sicher - um die bewegliche Ansicht zu machen, würden Sie ein Canvas ersetzen, wo wir das Raster namens "Dialog" haben. Sie müssten auch alle Drag/Drop-Sachen machen. Es gibt einen guten Überblick über dieses Konzept unter: http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx –

+0

Hallo Brad, große Antwort! Würden Sie den kompletten Quellcode des DialogPresenter teilen? Ich würde es gerne in einem meiner Projekte verwenden. Danke, Jens. – FantaMango77

1

Sie suchen hier keinen modalen Dialog. Sie benötigen eine Funktion, die das Steuerelement "Seite" deaktiviert, ein Dialogfeld anzeigt und es wieder aktiviert, wenn das Dialogfeld geschlossen wird.

Ich bin mir nicht sicher, ob Sie verstehen, was ein modaler Dialog bedeutet?

+0

Warum der Downvote? Ein Modal-Fenster ist ein Fenster, das das einzige Fenster ist, das zu diesem Zeitpunkt Eingaben für eine Anwendung akzeptieren kann. – Mez

4

I modal Kontrollen haben auf github ein Projekt zu schaffen, die eine benutzerdefinierte ist FrameworkElement, die Sie modalen Inhalt über den primären Inhalt angezeigt werden können.

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

Eigenschaften::

  • Displays beliebigen Inhalt

    Die Steuerung kann wie folgt verwendet werden.

  • Deaktiviert den primären Inhalt nicht, während der modale Inhalt angezeigt wird.
  • Deaktiviert den Maus- und Tastaturzugriff auf den primären Inhalt, während der modale Inhalt angezeigt wird.
  • Ist nur modal auf den Inhalt, den es abdeckt, nicht die gesamte Anwendung.
  • kann in einer MVVM-freundlichen Weise durch Bindung an die IsModal Eigenschaft verwendet werden.