在c#app中管理多个窗体窗体
有关管理具有多种表单的应用程序的好方法的任何想法,建议和模式。
第一页是登录,加载“主表单”,用户可以从那里启动许多其他“子表单”(可能会随着时间的推移而增长)。 用户应该能够在任何时候取消整个应用程序。
我知道我现在这样做的方式并不总是很优雅。
科迪
考虑使用DockPanel套件 。 它允许您创建多个表单,并为您的应用程序提供完整的对接面板解决方案。
我喜欢Explorer风格的界面:在主窗体中使用分割器。 使用左侧的列表控件或树控件,并将每个子表单的引用添加为项目上的标记。 当用户单击该项目时,将子表单从标记推送到拆分器的右侧。
您可以监视列表/树上的选择已更改事件以执行表单级validation。
您的设置方式没有任何根本性的错误,但我会更改您的登录表单与主表单之间的关系,以便您的主表单不会被您的登录表单加载。
在Program.cs文件的Main方法中,替换此(假定的)行:
Application.Run(new LoginForm());
用这样的东西:
LoginForm login = new LoginForm(); DialogResult result = login.ShowDialog(); login.Dispose(); if (result != DialogResult.Cancel) { Application.Run(new MainForm()); }
重写您的LoginForm,以便在登录成功时返回DialogResult.OK
( this.DialogResult = DialogResult.OK
),而不是加载并显示MainForm的实例。
从那时起,加载和显示MainForm中的其他表单没有任何问题,前提是这样的用户界面对您的程序有意义(例如,根据需要包含各种其他浮动工具窗口的图形编辑程序)。
用户可以通过关闭主窗体来“取消”整个应用程序,这对于Windows程序来说是非常正常的行为。
“管理具有多种forms的应用程序。”
嗨科迪,
提示:请记住,您可以随时访问(在您使用System.Windows.Forms库的任何上下文中)通过以下方式获取应用程序中打开表单的数量的非常方便的方法:
Application.OpenForms.Count
我认为很大程度上取决于“管理”多种forms的含义,以及“子forms”这个术语的含义。 我假设您已经熟悉.NET中的内置MDI多窗口工具,并寻找替代方案,或者您不会问这个问题。 如果我的假设是错误的,请纠正我。
如果您的意思是“子表格”:在“主表格”范围内创建的表格,那么当主表格关闭时,它们将被处理。
我个人喜欢WinForms中的“多个独立窗口”模型,有时也称为SDI +(我认为这是创建这个缩写词的Chris Sells)。
我喜欢从“hi-jacking”开始标准的Program.cs文件,因此Main过程如下所示:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Initializer.Initialize(); // it's now your responsibility to shut down the application ! Application.Run(); }
其中’Intializer是一个带有一个公共静态方法的公共静态类’Intialize; 它可能看起来像这样:
public static class Initializer { public static StartFormTemplate StartForm; public static MainFormTemplate MainForm; public static void Initialize() { MainForm = new MainFormTemplate(); MainForm.FormClosing += new FormClosingEventHandler(FormClosing); // StartForm will display MainForm in this case // MainForm.Show(); StartForm = new StartFormTemplate(); StartForm.FormClosing += new FormClosingEventHandler(FormClosing); StartForm.Show(); } }
在Initializer类的范围内创建的每个表单都将是一个“独立窗口”(实际上有:Parent == null)。
此模型中有趣的“业务”是FormClosing事件中的逻辑(此处未显示),在此示例中,StartForm和MainForm共享。 您可以通过使用FormClosing调用的’sender参数并与MainForm进行比较来轻松测试Mainform结束:
MainForm == sender
并且您可以使用Application.OpenForms.Count来检测何时只有一个“独立”窗口可以关闭。 棘手的部分是确保您检测到要保持MainWindow打开并首先处理它们的情况,必要时取消FormClose事件。
我认为这对初学者来说已经足够了:这可能是一个“报春道”,你真的不想下去:)
比尔,最好的
我会推荐智能客户端UI应用程序块。
该块旨在帮助您构建复杂的基于WinForm的解决方案。 它提供了经过validation的架构和实现,可帮助您使用业务线前端应用程序中的常见模式构建应用程序。
- 它允许您的应用程序基于模块或插件的概念。
- 通过UI组合维护可重用的代码。
- 它有助于使用模式进行开发,以便模块之间松散耦
- 从Presentation中分离模型(业务逻辑和数据访问)。
- 模型 – 视图 – 演示者模式。
您可以使用MDI 。 为此,请将父级的IsMdiContainer属性设置为true,并在显示子窗体之前将每个子级的MdiParent属性设置为父级。 然后,您可以使用MdiList菜单自动列出所有子窗体。
或者,您可以使用选项卡; 这对第三方框架来说最容易做到。
最后,您可以通过使用父窗体作为参数调用每个子窗体的Show方法来正常执行此操作。
有关更详细和具体的答案,请提供更多详细信息。
我使用导航式UI来做这种事情。 查看MSDN上的这篇文章,它描述了一个用于“归纳UI”应用程序的WinForms框架。