2012-10-24 11 views
6

Ostatnio studiowałem Androida i próbowałem przenieść jedną z jego funkcji do C# Compact Framework.Próba zamknięcia formularza po kolejnym jest wyświetlana w języku C# cf

To, co zrobiłem, to stworzyć klasę abstrakcyjną, którą nazywam Aktywnością. Klasa ta wygląda następująco

internal abstract class Activity 
    { 
     protected Form myForm; 
     private static Activity myCurrentActivity = null; 
     private static Activity myNextActivity = null; 

     internal static void LoadNext(Activity nextActivity) 
     { 
     myNextActivity = nextActivity; 
     if (myNextActivity != null) 
     { 
      myNextActivity.Show(); 
      if (myCurrentActivity != null) 
      { 
       myCurrentActivity.Close(); 
       myCurrentActivity = null; 
      } 
      myCurrentActivity = myNextActivity; 
      myNextActivity = null; 
     } 
     } 

     internal void Show() 
     { 
     //PROBLEM IS HERE 
     Application.Run(myForm); 
     //myForm.Show(); 
     //myForm.ShowDialog(); 
     // 
     } 

     internal void Close() 
     { 
     myForm.Close(); 
     } 


     internal void GenerateForm() 
     { 
     ///Code that uses the Layout class to create a form, and then stores it in myForm 
     //then attaches click handlers on all the clickable controls in the form 
     //it is besides the point in this problem 
     } 

     protected abstract void Click(Control control); 
     //this receives all the click events from all the controls in the form 
     //it is besides the point in this problem 

    } 

Problem mam tylko z prowadzeniem część komendy

Zasadniczo wszystkie moje zajęcia realizować powyższą klasę Show(), wczytać plik xml i wyświetlić go. Gdy chcę przejść do nowej klasy/postaci (na przykład idąc od ACMain do ACLogIn) używam tego kodu

Activity.LoadNext(new ACLogIn); 

która ma załadować kolejną postać, pokaż go i rozładować obecną formę

i próbował tych roztworów (w sposób Show()) i tu jest problem z każdym

  1. pomocą myForm.ShowDialog()
    To działa, ale blokuje wykonanie, co oznacza, że ​​stara forma nie zamyka, a tym bardziej mi poruszać się pomiędzy formami Im bardziej zwiększa się proces stos

  2. wykorzystujące myForm.Show()
    To działa, zamyka starą formę po sobie stary jest pokazany, ale natychmiast po tym zamyka program i kończy go

  3. użyciu Application.Run(myForm)
    to działa tylko na pierwszym formularzu ładowany, kiedy przejść do następnego formularza, to pokazuje ona następnie zgłasza wyjątek gadka " Wartość nie mieści się w oczekiwanym zakresie "

Czy ktoś może mi pomóc rozwiązać ten problem lub znaleźć alternatywę?

+1

Głównym problemem będzie to, że możesz mieć tylko 1 główny formularz. Sprawdź, czy aplikacja ma zapisywalną właściwość MainForm, a następnie użyj jej z Show(). –

Odpowiedz

5

Jeśli naprawdę chcesz stworzyć własne środowisko dla tej nawigacji, musisz ponownie przemyśleć swoje myśli. Forma formularza przekazana do Application.Run nigdy nie może zostać zamknięta - gdy to nastąpi, Application.Run kończy wykonywanie i (zwykle) Twój punkt wejścia static void Main kończy działanie, a aplikacja kończy działanie.

Co proponuję jest to, że zmieniają swoją aktywność albo bycie UserControl:

public abstract class Activity : UserControl 
{ 
    .... 
} 

lub Komponowanie jeden

public abstract class Activity 
{ 
    private UserControl m_control; 
    .... 
} 

Wtedy zamiast zamykania i pokazując Forms, rodzic wszystko od Działania wewnątrz głównego formularza jako kontener.

Jako uczciwe ostrzeżenie, stanie się to skomplikowane, gdy zaczniesz chcieć pokazywać elementy w motywie Tab, zamiast Stosu, lub mając widoki podzielone. Ramy wydają się proste do stworzenia, ale tak nie jest, dlatego przynajmniej rozważam użycie czegoś, co już zostało zrobione, chyba że masz nieodparte powody, by chcieć rzucić własną.

+0

ten pomysł, mój przyjaciel, jest naprawdę genialny, sprawia, że ​​czuję się wyjątkowo głupio, że o nim nie myślę, może to być lepsze niż mój pomysł otwarcia nowego formularza przed zamknięciem następnego. – Cruces

+0

Dokonałem wszystkich niezbędnych zmian w moim projekt w celu włączenia twojego pomysłu Teraz pokazuję tylko jeden formularz i dodam Panel (poszedłem z panelem) zamiast formularza do niego (jak powiedziałem, używam zwartej struktury, więc tutaj jest trochę dziwnie) i po dodaniu go usuwam stary i działa idealnie, stos procesu jest zawsze pusty, a ponadto czasy ładowania zostały przecięte na pół. Ponownie milion dzięki. jak mogę ci dać gwiazdy bazzilionowe? hmm, wymyślę to (: – Cruces

1

jest zwykle używany z przeciążeniem, które pobiera parametr Form. Byłaby to "główna" forma, która byłaby odpowiedzialna za rozpoczynanie/pokazywanie innych form. Ta "główna" forma może być "ukryta". Ale myślę, że to trochę niezręczne.

Jeśli nie potrzebujesz potrzebujesz głównego formularza, możesz użyć Application.Run(), aby uruchomić pompę komunikatów do przetwarzania wiadomości systemu Windows; ale wątek jest zajęty przetwarzaniem komunikatów i nie może wyświetlać okien dialogowych (muszą one być wyświetlane w wątku, który jest uruchomiony Application.Run). Można obejść ten problem poprzez stworzenie jednego lub więcej obiektów formularza przed nazywając Application.Run i te tworzą obiekty mogłyby stworzyć Timer obiekt, który nazwałbym Form.Show() lub Form.ShowDialog() na przewodnika Timer.Tick zdarzenia tak, że do formy jest pokazany po wywołaniu Run. Myślę, że to też jest trochę niezręczne.

Oba te rozwiązania to rodzaj obejścia tego, jak należy używać Windows i WinForm; więc myślę, że powinieneś pomyśleć o przeprojektowaniu tej aplikacji, aby działała w taki sposób, w jaki działa Windows i .NET.

Powiązane problemy