2010-12-22 8 views
5

Ehi, Ho un'applicazione WPF basata su Prism4. Quando si eseguono operazioni lente, voglio mostrare una schermata occupata. Avrò un gran numero di schermi, quindi sto cercando di creare un'unica soluzione nel framework piuttosto che aggiungere l'indicatore di occupato a ogni schermata.Come visualizzare un messaggio occupato su una schermata wpf

Queste operazioni a esecuzione prolungata vengono eseguite in un thread in background. Ciò consente di aggiornare l'interfaccia utente (buona) ma non impedisce all'utente di utilizzare l'interfaccia utente (non valida). Quello che mi piacerebbe fare è sovrapporre un controllo con una specie di quadrante rotante e avere quel controllo che copre l'intero schermo (il vecchio trucco HTML con DIV). Quando l'app è occupata, il controllo verrà visualizzato in tal modo bloccare ogni ulteriore interazione e mostrare la cosa spinny.

Per impostare questo, ho pensato che avrei potuto avere il mio schermo app in una tela insieme alla cosa spinny (con un ZIndex maggiore), quindi rendere visibile la cosa spinny come richiesto.

Questo, tuttavia, sta diventando difficile. Le tele non sembrano ben sistemate per questo e penso che potrei essere abbaiare sull'albero sbagliato.

Apprezzerei qualsiasi aiuto. Grazie.

+0

Vedere la mia risposta per un modo più semplice quando si vuole evitare che l'interazione con l'intera applicazione – markmnl

risposta

13

Ho fatto questo con alcuni programmi. Ecco in breve:

(Questo è più semplice con MVVM. È passato tanto tempo da quando ho usato il codebehid per cose come questa, non posso davvero dire se c'è un buon modo per farlo.)

  1. Creare un bordo nella finestra principale. Di solito lo faccio nero con una trasparenza del 50%. Aggiungi una griglia ad esso e metti quello che vuoi dentro per dire agli utenti che è occupato. Ridimensiona il bordo e i controlli al suo interno per riempire lo schermo.
  2. Creare una proprietà sul ViewModel principale per IsBusy come booleano. Inizializzalo come falso. Associare la proprietà Visibility del bordo occupato a quella proprietà.
  3. Quindi, creare una classe di convertitore per Occupato (Booleano) a Visibilità. Scrivi la logica in modo che quando il valore è True, quindi la visibilità sia Visibile, quando il valore è falso, la visibilità viene compressa. (http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx).
  4. Indietro sul bordo, aggiungere il convertitore alla rilegatura. Aggiungi codice a ViewModel per ciascuna delle tue pagine o viste che richiama quella proprietà e la imposta su true quando l'altro thread è occupato.

Cory

Edit:

<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

Grazie Cory. Il problema che ho (o il mio cervello debole ha) è come impostare il controllo in modo che si sovrapponga al controllo dell'app principale. Al momento ho la mia finestra principale con un dockpanel al suo interno. Non posso semplicemente aggiungere un bordo anche lì (il contenuto della finestra può essere impostato solo una volta) quindi devo usare un pannello per contenerli entrambi. L'ovvio da usare è Canvas, ma è meno che divertente da usare. long and short: come posso impostare il controllo di attesa e il controllo dell'applicazione nel passo 1? – dave

+0

Il pannello del dock è il contenitore più in alto? In tal caso inserisco il DockPanel in una griglia e lo faccio riempire completamente la griglia. Il Border può quindi sedersi in cima al DockPanel.Quasi sempre utilizzo una griglia come contenitore di livello superiore. Ho scoperto che mi consente molta più flessibilità con dove posso posizionare oggetti e come interagiscono con il resto dei contenuti di Windows. Ho aggiunto un piccolo codice sopra per mostrare un esempio. – CodeWarrior

+1

Sto usando un approccio simile per gli overlay occupati in una griglia: ho dovuto usare lo ZIndex per far sì che apparissero sempre in primo piano. – BrokenGlass

Problemi correlati