2008-10-06 9 views

Respuesta

25

Si estoy en lo cierto al interpretar su mensaje, quiere algo que funcione de manera similar a lo Billy Hollis demonstrates in his StaffLynx application.

Recientemente construí un control similar y resulta que este tipo de idea es relativamente simple de implementar en WPF. Creé un control personalizado llamado DialogPresenter. En la plantilla de control para el control personalizado, añadí marcado similar al siguiente:

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

También he añadido un método Show(Control view), que encuentra la del 'PART_DialogView', y añade el pasado en vista de la propiedad Content.

Esto entonces me permite usar la DialogPresenter de la siguiente manera:

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

al controlador de botones de evento (o comando de cota), simplemente llama al método Show() de la DialogPresenter.

También puede agregar fácilmente el marcado ScaleTransform a la plantilla DialogPresenter para obtener los efectos de escala que se muestran en el video. Esta solución tiene un código de control personalizado limpio y ordenado, y una interfaz muy simple para su equipo de programación de IU.

Espero que esto ayude!

+0

Sí, obtuve la idea de la aplicación StaffLynx. Me resulta muy difícil asimilar este material de WPF, pero creo que será más fácil. Para que el diálogo sea móvil, creo que hay más cosas que deben hacerse. –

+0

Ciertamente, para hacer la vista movible, sustituiría un lienzo donde tenemos la cuadrícula llamada "Diálogo". También tendrías que hacer todo lo de arrastrar/soltar. Hay una buena visión general de este concepto en: http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx –

+0

¡Hola Brad, gran respuesta! ¿Compartirías el código fuente completo de DialogPresenter? Me encantaría usarlo en uno de mis proyectos. Gracias, Jens. – FantaMango77

1

No está buscando un cuadro de diálogo modal aquí. Necesita una función que desactive el control de "página", muestre un cuadro de diálogo y vuelva a habilitarlo cuando se cierre el cuadro de diálogo.

No estoy seguro si entiendes lo que significa un diálogo modal.

+0

¿Por qué el voto a favor? Una ventana modal es una ventana que es la única ventana que puede aceptar entrada en ese momento para una aplicación. – Mez

4

Tengo un proyecto en github que es una costumbre FrameworkElement que le permite mostrar el contenido modal sobre el contenido principal.

El control se puede utilizar como esto:

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

Características:

  • Muestra contenido arbitrario.
  • No deshabilita el contenido principal mientras se muestra el contenido modal.
  • Desactiva el acceso del mouse y del teclado al contenido principal mientras se muestra el contenido modal.
  • Solo es modal para el contenido que cubre, no para toda la aplicación.
  • se puede utilizar de una manera amistosa MVVM mediante el enlace a la propiedad IsModal.
Cuestiones relacionadas