2010-12-22 13 views
5

Oye, Tengo una aplicación WPF basada en Prism4. Al realizar operaciones lentas, quiero mostrar una pantalla ocupada. Tendré una gran cantidad de pantallas, así que estoy tratando de construir una única solución en el marco en lugar de agregar el indicador de ocupado a cada pantalla.Cómo mostrar un mensaje ocupado en una pantalla wpf

Estas operaciones de larga ejecución se ejecutan en una cadena de fondo. Esto permite que la interfaz de usuario se actualice (bien) pero no impide que el usuario use la IU (mala). Lo que me gustaría hacer es superponer un control con un tipo de esfera giratoria y tener ese control cubrir toda la pantalla (el viejo truco de HTML con DIV). Cuando la aplicación está ocupada, el control se mostraría bloqueando cualquier interacción adicional, así como mostrando la cosa espigada.

Para configurar esto, pensé que solo podía tener la pantalla de mi aplicación en un lienzo junto con el elemento giratorio (con un mayor índice de Z) y luego hacer que el elemento giratorio fuera visible según fuera necesario.

Esto, sin embargo, se está poniendo difícil. Los lienzos no parecen estar bien preparados para esto y creo que podría estar ladrando el árbol equivocado.

Agradeceria cualquier ayuda. Gracias.

+0

ver mi respuesta de una manera más sencilla cuando se quiere evitar la interacción con la aplicación completa – markmnl

Respuesta

13

He hecho esto con algunos programas. Aquí está en pocas palabras:

(Esto es más fácil con MVVM. Ha pasado tanto tiempo desde que usé el codebehid para cosas como esta, no puedo decir si hay una buena manera de hacerlo)

  1. Cree un borde en su ventana principal. Normalmente lo hago negro con una transparencia del 50%. Agregue una cuadrícula y coloque lo que quiera dentro para indicarle a los usuarios que está ocupado. Tamaño del borde y los controles dentro de él para llenar la pantalla.
  2. Cree una propiedad en su ViewModel principal para IsBusy como booleano. Inicialízalo como Falso. Enlace la propiedad Visibilidad de la Frontera ocupada a esa propiedad.
  3. A continuación, cree una clase de convertidor para Ocupado (booleano) en Visibilidad. Escriba la lógica en eso para que cuando el valor sea Verdadero, entonces la visibilidad sea Visible, cuando el valor sea falso, la visibilidad se contraiga. (http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx).
  4. De vuelta en el borde, agregue su convertidor al enlace. Agregue código al ViewModel para cada una de sus Páginas o Vistas que devuelva la llamada a esa propiedad y la configure en verdadero cuando su otro hilo esté ocupado.

Cory

Editar:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="MainWindow" 
x:Name="Window" 
Title="MainWindow" 
Width="640" Height="480"> 

<Grid> 

    <Border BorderBrush="Black" BorderThickness="1" Background="#80000000" Visibility="Collapsed"> 
     <Grid> 
      <TextBlock Margin="0" TextWrapping="Wrap" Text="Busy...Please Wait" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="26.667" FontWeight="Bold" Foreground="#7EFFFFFF"/> 
     </Grid> 
    </Border> 

    <DockPanel x:Name="LayoutRoot"> 
     <CheckBox Content="CheckBox" VerticalAlignment="Top"/> 
     <TextBlock TextWrapping="Wrap"><Run Text="TextBlock"/></TextBlock> 
     <UserControl x:Name="ViewViewView"/> 
    </DockPanel> 
</Grid> 

+0

Gracias Cory. El problema que tengo (o mi cerebro débil) es cómo configurar el control para que se superponga al control principal de la aplicación. Actualmente tengo mi ventana principal con un panel de conexión dentro. No puedo simplemente agregar un borde allí también (el contenido de la ventana solo se puede establecer una vez), así que tengo que usar un panel para contener ambos. El más obvio de usar es Canvas, pero es menos que divertido de usar. largo y corto: ¿Cómo configuro mi control de espera y el control de la aplicación en su paso 1? – dave

+0

¿El panel de la base es el contenedor más alto? En ese caso, colocaría el DockPanel en una rejilla y lo llenaría por completo. El borde puede sentarse en la parte superior del DockPanel.Casi siempre uso una grilla como contenedor de nivel superior. He descubierto que me permite mucha más flexibilidad con dónde puedo colocar elementos y cómo interactúan con el resto de los contenidos de Windows. He agregado un pequeño código arriba para mostrar un ejemplo. – CodeWarrior

+1

Estoy usando un enfoque similar para las superposiciones ocupadas en una grilla - Tuve que usar ZIndex para hacer que siempre aparezcan en la parte superior. – BrokenGlass

Cuestiones relacionadas