2010-12-22 14 views
5

Hej, Mam aplikację WPF opartą na Prism4. Podczas wykonywania powolnych operacji chcę wyświetlać zajęty ekran. Będę miał dużą liczbę ekranów, więc staram się stworzyć jedno rozwiązanie w ramach, zamiast dodawać wskaźnik zajętości do każdego ekranu.Jak wyświetlić komunikat zajęty na ekranie wpf

Te długo działające operacje działają w wątku tła. Dzięki temu interfejs użytkownika może być aktualizowany (dobry), ale nie powstrzymuje użytkownika przed używaniem interfejsu użytkownika (złego). To, co chciałbym zrobić, to nałożyć na kontrolkę coś w rodzaju obracającego się pokrętła i kontrolować cały ekran (stara sztuczka z DIV). Gdy aplikacja jest zajęta, kontrolka wyświetli blokując wszelkie dalsze interakcje, a także pokazując spiny.

Aby to ustawić, pomyślałem, że mogę po prostu mieć ekran swojej aplikacji na płótnie razem ze spinal thing (z większym ZIndexem), a następnie sprawić, że spun będzie widoczny jako wymagany.

To jednak staje się trudne. Płótna nie wydają się dobrze przystosowane do tego i myślę, że mogę szczekać złe drzewo.

Byłbym wdzięczny za każdą pomoc. Dzięki.

+0

zobaczyć moją odpowiedź na prostszy sposób, jeśli chcesz, aby zapobiec interakcji z całej aplikacji – markmnl

Odpowiedz

13

Zrobiłem to za pomocą kilku programów. Tutaj jest w pigułce:

(Jest to najłatwiejsze z MVVM, od dawna używałem tego kodu do takich rzeczy jak to, ale nie mogę powiedzieć, czy jest to dobry sposób na zrobienie tego.)

  1. Utwórz ramkę w głównym oknie. Zazwyczaj robię to na czarno z 50% przezroczystością. Dodaj do niego siatkę i umieść, co chcesz, aby powiedzieć użytkownikom, że jest zajęty. Rozmiar obramowania i kontroli wewnątrz niego, aby wypełnić ekran.
  2. Utwórz właściwość na głównym ViewModel dla IsBusy jako boolean. Zainicjuj go jako Fałsz. Powiąż właściwość Visibility z Busy Border z tą właściwością.
  3. Następnie utwórz klasę konwertera dla Zajęty (Boolean) na Widoczność. Zapisz logikę, aby wartość była prawdą, wtedy widoczność jest widoczna, gdy wartość jest fałszywa, widoczność jest zwinięta. (http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx).
  4. Wracając do granicy, dodaj konwerter do wiązania. Dodaj kod do ViewModel dla każdej strony lub widoków, które wywołują tę właściwość i ustawia ją na true, gdy twój drugi wątek jest zajęty.

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

Dzięki Cory. Problemem, który mam (lub moim słabym mózgiem) jest to, jak ustawić kontrolę, aby pokrywał się z główną kontrolą aplikacji. Obecnie mam moje główne okno z panelem w środku. Nie mogę też po prostu dodać tam granicy (zawartość okna może być ustawiona tylko raz), więc muszę użyć panelu, aby je zawrzeć. Oczywistym do zastosowania jest Canvas, ale nie jest to przyjemne w użyciu. długa i krótka: Jak ustawić kontrolę oczekiwania i kontrolę aplikacji w kroku 1? – dave

+0

Panel dokowania jest najbardziej pojemnym kontenerem? W takim przypadku umieściłbym DockPanel w siatce i całkowicie wypełniłby ją. Granica może następnie usiąść na szczycie panelu DockPanel.Prawie zawsze używam siatki jako kontener najwyższego poziomu. Odkryłem, że pozwala mi to na dużo większą elastyczność, gdy mogę umieszczać przedmioty i jak wchodzą w interakcje z resztą zawartości okien. Dodałem mały kod powyżej, aby pokazać przykład. – CodeWarrior

+1

Używam podobnego podejścia do obciążonych nakładek w siatce - musiałem jednak użyć ZIndex, aby zawsze pojawiały się na wierzchu. – BrokenGlass

Powiązane problemy