2008-11-07 9 views
13

Ich habe eine Reihe von Steuerelementen auf meinem Fenster. Eine davon ist eine Aktualisierungsschaltfläche, die eine umständliche Aufgabe in einem Hintergrundthread ausführt.Deaktivieren aller außer einem untergeordneten Steuerelement in einem WPF-Fenster

Wenn der Benutzer auf die Aktualisierungsschaltfläche klickt, setze ich den Cursor in einen Warte- (Sanduhr-) Status und deaktiviere das gesamte Fenster - Me.IsEnabled = False.

Ich möchte die Löschung der Aktualisierungsaktion unterstützen, indem ich den Benutzer auf eine Abbrechen-Schaltfläche klicken lasse, aber ich kann dies nicht ermöglichen, während das gesamte Fenster deaktiviert ist.

Gibt es eine Möglichkeit, dies zu tun, außer jedes Steuerelement (mit Ausnahme der Abbrechen-Schaltfläche) nacheinander zu deaktivieren und dann einzeln wieder zu aktivieren, wenn der Benutzer auf Abbrechen klickt?

+0

Ich kann nicht scheinen, sowohl Me.IsEnabled und Me.Cursor zu verwenden. http://stackoverflow.com/questions/762396/wpf-wait-cursor-with-backgroundworker-thread –

Antwort

19

Sie können alle Steuerelemente in einem Panel (Grid, Stackpanel, etc.) setzen, und lassen Sie die Taste in einem anderen Panel abzubrechen. Legen Sie anschließend die IsEnabled-Eigenschaft des anderen Bereichs fest.

In der Praxis wird dies wahrscheinlich mehr als ein zusätzliches Panel einbringen.

Zum Beispiel, wenn Sie eine Stackpanel von Schaltflächen haben, können Sie eine zusätzliche Stackpanel hinzufügen:

<StackPanel Orientation="Horizontal"> 
    <StackPanel x:Name="controlContainer" Orientation="Horizontal"> 
     <!-- Other Buttons Here --> 
    </StackPanel> 
    <Button Content="Cancel" /> 
</StackPanel> 

Dann würden Sie die folgenden Schritte aus, alles zu deaktivieren, aber die Taste abbrechen:

controlContainer.IsEnabled = false; 
+0

StackPanel hat keine IsEnabled-Eigenschaft in WP8 – radders

+0

Nun, ich habe 0 mit WP8 arbeiten, aber ich fand die Dokumente für das WP8 'StackPanel': http://msdn.microsoft.com/en-US/library/ windows/apps/windows.ui.xaml.controls.stackpanel.aspx Ich nehme an, Sie verwenden diese API und nicht die Silverlight, da Silverlight über eine 'IsEnabled'-Eigenschaft verfügt. Während Sie nicht das genaue Aussehen von deaktivierten Steuerelementen erhalten, könnten Sie immer 'IsHitTestVisible =" false "' setzen, um die Eingabe für 'controlContainer' zu deaktivieren. Andernfalls könnten Sie eine halbtransparente Überlagerung erstellen, die Sie sichtbar machen, wenn Sie die anderen Steuerelemente deaktivieren möchten (und ein "Grid" als äußeres Feld verwenden). –

3

Sie können die IsEnabled-Eigenschaft jedes Steuerelements an Ihre benutzerdefinierte boolesche Abhängigkeitseigenschaft binden, die signalisiert, wenn Ihre Anwendung gesperrt ist. Binde den Abbrechen-Knopf einfach nicht ein.

Wie Donnelle erwähnt Sie können Multi-Bindung mit einem Konverter einrichten. Hier sind ein paar Beispiele, auf die Sie sich beziehen können. WPF MultiBinding with Converter Implementing Parameterized MultiBinding Sample

+0

Das einzige Problem, das ich habe w/das ist, dass die IsEnabled-Eigenschaft für einige meiner Steuerelemente bereits Daten an eine boolesche Eigenschaft gebunden ist für andere Zwecke. –

+1

Sie könnten eine Mehrfachbindung mit einem Konverter verwenden. Es gibt Beispiele dafür, wie Sie eine generische Verknüpfung mit einem Parameter für UND- oder ODER-Verhalten durchführen können. – Donnelle

5

Ich wollte auch, dass der Benutzer den Ladevorgang abbrechen konnte. Ich fand eine schöne Lösung.

foreach (Control ctrl in this.Controls) 
    ctrl.Enabled = false; 

CancelButton.Enabled = true; 

Dies ermöglicht auch das Hauptfenster im Gegensatz zu this.Enabled = false; ausgewählt und bewegt werden, die vollständig aus dem Fenster sperrt.

+0

Steuerelement hat in WP8 keine IsEnabled-Eigenschaft – radders