在C#cf中显示下一个表单后尝试关闭该表单

在C#cf中显示下一个表单后尝试关闭该表单,c#,winforms,compact-framework,C#,Winforms,Compact Framework,我最近一直在研究Android,我试图将它的一个功能移植到C#compact框架 我所做的是创建一个抽象类,我称之为Activity。 这个班看起来像这样 internal abstract class Activity { protected Form myForm; private static Activity myCurrentActivity = null; private static Activity myNextActivity = n

我最近一直在研究Android,我试图将它的一个功能移植到C#compact框架

我所做的是创建一个抽象类,我称之为Activity。 这个班看起来像这样

  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

   }
我遇到的问题是运行
Show()
命令的部分

基本上我所有的类都实现了上面的类,加载一个xml文件并显示它。 当我想要转换到一个新的类/表单时(例如从ACMain转换到ACLogIn) 我使用这个代码

Activity.LoadNext(new ACLogIn);
它应该加载下一个表单,显示它,然后卸载当前表单

我已经尝试过这些解决方案(在
Show()
方法中),下面是每个解决方案的问题

  • 使用
    myForm.ShowDialog()

    这可以工作,但会阻止执行,这意味着旧表单不会关闭,我在表单之间移动的次数越多,进程堆栈增加的次数越多

  • 使用
    myForm.Show()

    这是可行的,在显示旧窗体后关闭旧窗体,但紧接着关闭程序并终止它

  • 使用
    Application.Run(myForm)

    这只适用于加载的第一个表单,当我移动到下一个表单时,它会显示它然后抛出一个异常,说“值不在预期范围内”


  • 有人能帮我解决这个问题或找到替代方法吗?

    应用程序。Run
    通常与带有
    表单
    参数的重载一起使用。这将是负责启动/显示其他表单的“主”表单。这种“主要”形式可能是“隐藏的”。但是,我觉得这有点尴尬

    或者,您不需要主窗体,可以使用
    Application.Run()
    启动消息泵来处理Windows消息;但是,线程正忙于处理消息,无法显示对话框(它们必须显示在运行
    应用程序的线程中。运行
    )。您可以通过在调用
    应用程序之前创建一个或多个表单对象来解决此问题。运行
    ,这些表单对象可以创建一个
    计时器
    对象,该对象将调用
    form.Show()
    form.ShowDialog()
    计时器上的
    。勾选事件处理程序,以便在调用
    Run
    后显示for form。我觉得这也有点尴尬


    这两种解决方案都在某种程度上规避了Windows和WinForms的使用方式;因此,我认为您需要考虑重新设计此应用程序,使其与Windows和.NET的工作方式兼容。

    如果您真的在为此导航创建自己的框架,则需要重新设计。传递到
    Application.Run
    的表单实例决不能关闭-当它关闭时,Application.Run完成执行,并且(通常)您的
    静态void Main
    入口点退出,应用程序终止

    我建议您将活动更改为用户控件:

    public abstract class Activity : UserControl
    {
      .... 
    }
    
    还是作曲

    public abstract class Activity
    {
        private UserControl m_control;
      .... 
    }
    
    然后,不再关闭和显示表单,而是将主表单中的所有活动作为容器设置为父级


    作为一个合理的警告,当您开始希望在选项卡主题而不是堆栈中显示内容,或者使用拆分视图时,这将变得复杂。框架看起来很容易创建,但它们不是这样的,我至少应该考虑使用已经做过的事情,除非你有强迫性的理由想自己滚动。

    主要的问题是你只能有1种主要形式。看看应用程序是否有一个可写的MainForm属性,然后将其与Show()一起使用。我的朋友,这个想法真是太棒了,它让我觉得自己非常愚蠢,因为我没有考虑它,实际上,这可能比我在关闭下一个表单之前打开一个新表单的想法要好。我已经对我的项目进行了所有必要的更改,以便纳入您的想法。我现在只显示一个表单,并添加一个面板(我使用了面板),而不是表单(正如我所说的,我使用的是compact framework,所以这里有点奇怪)在添加它之后,我删除了旧的一个,它工作得很好,进程堆栈总是空的,而且加载时间减少了一半。再次万分感谢。现在我怎样才能给你一颗星星?嗯,我会弄明白的(: