Pregunta

Tengo una ventana de WPF que tiene, entre otros controles, un Frame. En ese marco muestro diferentes páginas. ¿Hay alguna forma de hacer un diálogo modal para solo una página? Cuando muestro el cuadro de diálogo, no debería ser posible hacer clic en ningún control en la página, pero debería ser posible hacer clic en un control en la misma ventana que no está en la página.

¿Fue útil?

Solución

Si interpreto correctamente tu mensaje, quieres algo que funcione de manera similar a lo que Billy Hollis se manifiesta en su aplicación StaffLynx .

Recientemente construí un control similar y resulta que este tipo de idea es relativamente simple de implementar en WPF. He creado un control personalizado llamado DialogPresenter. En la plantilla de control para el control personalizado, agregué un 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 agregué un método Mostrar (vista de control) , que encuentra el 'PART_DialogView', y agrega el contenido pasado a la propiedad Content .

Esto me permite usar el 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 eventos de botones (o comando enlazado), simplemente llamo al método Show () del DialogPresenter .

También puede agregar fácilmente el marcado ScaleTransform a la plantilla DialogPresenter para obtener los efectos de escalamiento 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 UI.

Espero que esto ayude!

Otros consejos

Tengo un proyecto en github que es un Framework Element personalizado que es le permite mostrar contenido modal sobre el contenido principal.

El control se puede utilizar de esta manera:

<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.
  • Deshabilita el acceso del mouse y el teclado al contenido principal mientras se muestra el contenido modal.
  • Solo es modal al contenido que cubre, no a toda la aplicación.
  • se puede utilizar de una forma amigable con MVVM vinculando a la propiedad IsModal .

¿Por qué no solo usar bombas de mensajes anidados para crear controles modales

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

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

No estoy muy seguro de si entiendes lo que se supone que debe hacer un diálogo modal?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top