在C#cf中显示下一个表单后尝试关闭该表单
我最近一直在研究Android,我试图将它的一个功能移植到C#compact框架 我所做的是创建一个抽象类,我称之为Activity。 这个班看起来像这样在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
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,所以这里有点奇怪)在添加它之后,我删除了旧的一个,它工作得很好,进程堆栈总是空的,而且加载时间减少了一半。再次万分感谢。现在我怎样才能给你一颗星星?嗯,我会弄明白的(: