2012-10-24 5 views
6

Ich habe Android in letzter Zeit untersucht, und ich habe versucht, eine seiner Funktionen in C# kompakte Framework zu portieren.Versuchen, ein Formular nach dem nächsten zu schließen ist in C# cf

Ich habe eine abstrakte Klasse erstellt, die ich Aktivität nenne. Diese Klasse wie dies

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 

    } 

sieht das Problem, das ich ist habe mit dem Teil des Show() Befehls

Grundsätzlich ist alle meine Klassen die obige Klasse implementieren, eine XML-Datei laden und anzeigen. Wenn ich will (zum Beispiel geht von ACMain zu ACLogIn) zu einer neuen Klasse/Form zu überführen verwende ich diesen Code

Activity.LoadNext(new ACLogIn); 

, die angeblich die nächste Form zu laden, zeigen Sie sich, und die aktuelle Form entladen

ich habe diese Lösungen (in der Show() Methode) versucht, und hier ist das Problem mit jedem

  1. mit myForm.ShowDialog()
    Dies funktioniert, aber blockiert die Ausführung, was bedeutet, dass die alte Form nicht schließt, und je mehr ich bewege sich zwischen den Formen, desto mehr der Prozess-Stack erhöht

  2. mit myForm.Show()
    Dies funktioniert, schließt die alte Form nach dem alte wird gezeigt, aber unmittelbar danach das Programm geschlossen und beendet sie

  3. Application.Run(myForm)
    Verwendung Dies funktioniert nur auf dem ersten Formular geladen, wenn ich auf die nächste Form bewegen, zeigt er es dann eine Ausnahme auslöst sagen " Wert fällt nicht in den erwarteten Bereich "

Kann mir jemand helfen, dies zu beheben oder eine Alternative zu finden?

+1

Das Hauptproblem wäre, dass Sie nur 1 Hauptformular haben können. Überprüfen Sie, ob die Anwendung eine beschreibbare MainForm-Eigenschaft hat und verwenden Sie diese mit Show(). –

Antwort

5

Wenn Sie wirklich ein eigenes Framework für diese Navigation erstellen möchten, müssen Sie nachdenken. Die Forminstanz, die an Application.Run übergeben wurde, darf niemals schließen. Wenn dies der Fall ist, beendet Application.Run die Ausführung und (normalerweise) Ihr static void Main Einstiegspunkt wird beendet und die Anwendung wird beendet.

Was würde ich vorschlagen, dass Sie Ihre Aktivität ändern, um entweder zu sein ein Usercontrol:

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

oder Komponieren ein

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

Dann anstelle des Schließens und zeigt Formen, Eltern alle von die Aktivitäten im Hauptformular als Container.

Als faire Warnung wird dies komplex, wenn Sie beginnen, Dinge in einem Tab-Motiv anstelle eines Stapels anzuzeigen oder geteilte Ansichten zu haben. Frameworks scheinen einfach zu erstellen, aber sie sind nicht so, also würde ich zumindest in Erwägung ziehen, etwas zu verwenden, was bereits erledigt ist, es sei denn, Sie haben zwingende Gründe, Ihre eigenen zu erstellen.

+0

diese Idee mein Freund, ist wirklich brillant, es macht mich extrem dumm fühlen, nicht darüber nachzudenken, kann es tatsächlich besser als meine Idee, eine neue Form zu öffnen, bevor die nächste schließen – Cruces

+0

Ich habe alle notwendigen Änderungen an meinem gemacht Projekt, um Ihre Idee zu integrieren Ich zeige jetzt nur ein Formular und füge ein Panel (ich ging mit Panel) anstelle eines Formulars hinzu (wie gesagt ich benutze ein kompaktes Framework, also sind die Dinge hier ein bisschen komisch) und nachdem ich es hinzugefügt habe, entferne ich das alte und es funktioniert perfekt, der Prozessstapel ist immer leer, und außerdem wurden die Ladezeiten halbiert. Wieder eine Million Dank. jetzt, wie kann ich dir ein bazzilion Sterne geben? hmm ich werde es herausfinden (: – Cruces

1

Application.Run wird in der Regel mit der Überlast verwendet, die einen Form Parameter verwendet. Dies wäre die "Hauptform", die für das Starten/Zeigen anderer Formulare verantwortlich wäre. Diese "Hauptform" könnte "versteckt" sein. Aber ich denke, das ist ein bisschen peinlich.

Alternativ können Sie nicht ein Hauptformular verwenden, können Sie Application.Run() verwenden, um eine Nachrichtenpumpe zu starten, um Windows-Nachrichten zu verarbeiten; Aber dann verarbeitet der Thread Nachrichten und kann keine Dialoge anzeigen (sie müssen in dem Thread angezeigt werden, der ausgeführt wird Application.Run). Sie können dies umgehen, indem vorApplication.Run Aufruf und diese Formularobjekte ein Timer Objekt könnten ein oder mehr Formularobjekte zu schaffen erstellen, die Form.Show() oder Form.ShowDialog() auf den Timer.Tick Ereignishandler nennen würde, so dass für Form nach dem Aufruf Run gezeigt. Ich denke, das ist auch etwas peinlich.

Beide Lösungen umgehen die Art und Weise, wie Windows und WinForms verwendet werden sollen. Daher denke ich, dass Sie darüber nachdenken müssen, diese Anwendung so zu gestalten, dass sie mit Windows und .NET funktioniert.