2008-11-07 13 views
13

Mam kilka elementów sterujących w moim oknie. Jednym z nich jest przycisk odświeżania, który wykonuje niewygodne zadanie w wątku tła.Wyłączanie wszystkich kontrolek podrzędnych z wyjątkiem jednego w oknie WPF

Gdy użytkownik kliknie przycisk odświeżania, ustawiam kursor w statusie oczekiwania (klepsydra) i wyłączę całe okno - Me.IsEnabled = False.

Chciałbym wesprzeć anulowanie akcji odświeżania, umożliwiając użytkownikowi kliknięcie przycisku anulowania, ale nie mogę tego ułatwić, gdy całe okno jest wyłączone.

Czy istnieje sposób, aby to zrobić, oprócz wyłączania poszczególnych elementów sterujących (z wyjątkiem przycisku anulowania) pojedynczo, a następnie ponownie włączając je jeden po drugim, gdy użytkownik kliknie anuluj?

+0

Nie mogę używać obu Me.IsEnabled i Me.Cursor. http://stackoverflow.com/questions/762396/wpf-wait-cursor-with-backgroundworker-thread –

Odpowiedz

19

można umieścić wszystkie elementy sterujące w jednym panelu (Siatka, StackPanel, itd.) I pozostawić przycisk Anuluj w innym panelu. Następnie ustaw właściwość IsEnabled na drugim panelu.

W praktyce prawdopodobnie wprowadzi to więcej niż jeden dodatkowy panel.

Na przykład, jeśli miał StackPanel przycisków, można dodać dodatkowy StackPanel:

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

Następnie, należy wykonać następujące czynności, aby wyłączyć wszystko, ale przycisk Anuluj:

controlContainer.IsEnabled = false; 
+0

StackPanel nie ma własności IsEnabled w WP8 – radders

+0

Cóż, wykonałem 0 pracy z WP8, ale znalazłem dokumenty dla WP8 'StackPanel': http://msdn.microsoft.com/en-US/library/ windows/apps/windows.ui.xaml.controls.stackpanel.aspx Zakładam, że używasz tego api, a nie Silverlight, ponieważ Silverlight ma właściwość 'IsEnabled'. Chociaż nie można uzyskać dokładnego wyglądu wyłączonych elementów sterujących, zawsze można ustawić opcję 'IsHitTestVisible =" false "', aby wyłączyć wejście w obiekcie 'controlContainer'. W przeciwnym razie możesz mieć półprzezroczystą nakładkę, którą uwidocznisz, gdy chcesz wyłączyć inne kontrolki (i użyj 'Grid' jako zewnętrznego panelu). –

3

Możesz powiązać każdą właściwość kontrolną IsEnabled z twoją niestandardową właściwością zależności boolean, która sygnalizuje, kiedy twoja aplikacja jest zablokowana. Po prostu nie wiąż przycisku Anuluj.

Jak wspomniał Donnelle Możesz ustawić wiązanie multi z konwerterem. Oto kilka przykładów, do których możesz się odnosić. WPF MultiBinding with Converter Implementing Parameterized MultiBinding Sample

+0

Jedyny problem jaki mam w/to, że właściwość IsEnabled w niektórych moich kontrolkach jest już danymi powiązanymi z właściwością boolean do innych celów. –

+1

Można użyć multi-binding z konwerterem - istnieją przykłady, jak zrobić ogólny z parametrem dla zachowań AND lub OR. – Donnelle

5

Chciałem również, aby użytkownik mógł anulować ładowanie. Znalazłem piękne rozwiązanie.

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

CancelButton.Enabled = true; 

Pozwala to również główny okno może być wybrany i przeniesiono przeciwieństwie this.Enabled = false; które całkowicie blokuje okno.

+0

Kontrola nie ma właściwości IsEnabled w WP8 – radders

Powiązane problemy