2010-12-22 7 views
5

Hey, Ich habe eine WPF-Anwendung, die auf Prism4 basiert. Bei langsamen Vorgängen möchte ich einen aktiven Bildschirm anzeigen. Ich werde eine große Anzahl von Bildschirmen haben, also versuche ich, eine einzige Lösung in das Framework zu integrieren, anstatt jedem Bildschirm den Busy-Indikator hinzuzufügen.Wie man eine beschäftigte Nachricht über einem wpf Bildschirm anzeigt

Diese lang laufenden Operationen werden in einem Hintergrundthread ausgeführt. Dadurch kann die Benutzeroberfläche aktualisiert werden (gut), der Benutzer wird jedoch nicht daran gehindert, die Benutzeroberfläche zu verwenden (schlecht). Was ich tun möchte, ist, ein Steuerelement mit einer sich drehenden Dial-Art zu überlagern und diese Kontrolle über den gesamten Bildschirm abzudecken (der alte HTML-Trick mit DIVs). Wenn die App beschäftigt ist, würde die Steuerung anzeigen, so dass jede weitere Interaktion blockiert wird und die Spinning-Sache angezeigt wird.

Um das einzurichten, dachte ich, ich könnte einfach meinen App-Bildschirm in einer Leinwand zusammen mit dem Spinning Ding (mit einem größeren ZIndex) haben, dann machen Sie das Spinning-Ding wie erforderlich sichtbar.

Dies wird jedoch hart. Leinwände scheinen dafür nicht gut aufgestellt zu sein und ich denke, ich könnte den falschen Baum bellen.

Ich würde jede Hilfe zu schätzen wissen. Vielen Dank.

+0

siehe meine Antwort für eine einfachere Art und Weise, wenn Sie Interaktion mit der gesamten App verhindern wollen – markmnl

Antwort

13

Ich habe dies mit ein paar Programmen getan. Hier ist es kurz und bündig:

(Dies ist am einfachsten mit MVVM. Es ist so lange her, dass ich das Codebehid für solche Dinge verwendet habe ich kann nicht wirklich sagen, ob es eine gute Möglichkeit ist, es zu tun.)

  1. Erstellen Sie einen Rahmen in Ihrem Hauptfenster. Normalerweise mache ich es schwarz mit einer 50% Transparenz. Fügen Sie ein Raster hinzu und legen Sie das, was Sie wollen, um den Benutzern mitzuteilen, dass sie beschäftigt sind. Größe der Grenze und der Steuerelemente darin, um den Bildschirm zu füllen.
  2. Erstellen Sie eine Eigenschaft in Ihrem Haupt-ViewModel für IsBusy als Boolean. Initialisiere es als Falsch. Binden Sie die Visibility-Eigenschaft des Busy Border an diese Eigenschaft.
  3. Als nächstes machen Sie eine Konverterklasse für Busy (Boolean) zu Sichtbarkeit. Schreiben Sie die Logik so, dass der Wert Wahr ist, dann ist die Sichtbarkeit sichtbar, wenn der Wert falsch ist, ist die Sichtbarkeit reduziert. (http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx).
  4. Zurück an der Grenze, fügen Sie Ihren Konverter der Bindung hinzu. Fügen Sie dem ViewModel für jede Ihrer Pages oder Views Code hinzu, der diese Eigenschaft aufruft und setzt sie auf "true", wenn Ihr anderer Thread beschäftigt ist.

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

Danke Cory. Das Problem, das ich habe (oder mein schwaches Gehirn hat) ist, wie man das Steuerelement einrichtet, so dass es die Hauptapp-Kontrolle überschneidet. Ich habe derzeit mein Hauptfenster mit einem Dockpanel drin. Ich kann dort auch nicht einfach einen Rahmen hinzufügen (Fensterinhalt kann nur einmal eingestellt werden), also muss ich einen Bereich benutzen, um beides zu enthalten. Der offensichtlichste zu verwendende ist Canvas, aber es ist weniger als Spaß zu benutzen. lang und kurz: Wie lege ich meine wartende Steuerung und Anwendungssteuerung in Schritt 1 an? – dave

+0

Das Dock-Panel ist der oberste Container? In diesem Fall würde ich das DockPanel in ein Gitter setzen und es das Gitter vollständig füllen lassen. Der Rahmen kann dann oben auf dem DockPanel sitzen.Ich benutze fast immer ein Gitter als oberster Container. Ich habe festgestellt, dass es mir viel mehr Flexibilität gibt, wo ich Gegenstände platzieren kann und wie sie mit dem Rest des Windows-Inhalts interagieren. Ich habe oben einen kleinen Code hinzugefügt, um ein Beispiel zu zeigen. – CodeWarrior

+1

Ich verwende einen ähnlichen Ansatz für beschäftigte Überlagerungen in einem Raster - ich musste den ZIndex jedoch verwenden, um sie immer oben erscheinen zu lassen. – BrokenGlass

Verwandte Themen