c# – 多表单应用程序的最佳做法,以显示和隐藏表单?
StackOverflow有很多问题,询问如何隐藏Form1并显示Form2.通常,几个不同的答案出现:
1) // Program.cs Application.Run(new Form1()); // Form1.cs Form2 form2 = new Form2(); form2.Show(); this.Hide(); 2) // Program.cs Form1 form1 = new Form1(); Form2 form2 = new Form2(); form1.Show(); form2.Show(); Application.Run(); …等等.. 我不是在寻找像#1这样简单的一次性解决方案.我正在寻找最佳的表单管理实践.一个5-8种形式的应用程序,经常打开和关闭 – 什么是管理这些表单的最佳方法? 我的想法是使每个形式(懒惰?)Singleton并将它们埋在某种类型的FormsManager类中(如解决方案#2但是).然后单独的表单可能会调用像FormsManager.GetForm< WelcomeDialog>(). 但是我想知道有哪些人使用更多的经验.再次,这些解决方案不应该是快速的黑客.他们应该是面向设计,也许是建筑和长期的解决方案. 编辑: 对于可能有同样麻烦的人来说,这是一个非常通用的问题(所以要求很开放).具体到我的情况,我不需要在启动时显示多种形式.此外,我没有MDI表单.我可能有一些模式,但它们大多是非模态的. 解决方法
我在这里回答一般.
我不认为单身形态适合表单管理.通常,您希望将一些上下文参数传递给窗体,您可能希望打开同一窗体的多个实例.所以单身人士不适合海事组织. 我认为表单管理应该很简单. 例如,如果你想从另一个表单中显示一个模态窗体,我会写一些非常简单的东西: private void button1_Click(object sender,EventArgs e) { using (ModalForm1 frm = new ModalForm1(myParam)) { frm.ShowDialog(); if (frm.MyResultProperty == ...) { // Do some job here } } } 当然,您可以编写一些接口/泛型语法来避免一些代码重复,以防您想要显示大量的模态窗体: public interface IFormResult<T> { T Result { get; set; } } public class ModalForm1 : Form,IFormResult<string> { public ModalForm1() { InitializeComponent(); this.Result = "My result"; } public string Result { get; set; } } private void button1_Click(object sender,EventArgs e) { string res = ShowModalForm<ModalForm1,string>(); } private static T2 ShowModalForm<T1,T2>() where T1 : Form,IFormResult<T2>,new() { using (T1 form = new T1()) { form.ShowDialog(); return form.Result; } } 但老实说,我觉得这有点过分了. 第二点:如果您的表单不完全遵循此特定行为(ShowDialog(),则会设置Result属性),那么您必须编写另一个Interface …等. 如果这种类型的语法(泛型,接口等)不会减少编写的代码行的数量或复杂性或可维护性(显然我们不能说这是真的这样),那么它很漂亮无用的海事组织 编辑: 表单管理真的取决于你的用例. >如果您同时说20个可以显示的表单,那么您应该考虑一个FormManager概念(或者更好的是:考虑如何通过减少可能的打开表单的数量来改善用户体验) 通常,用于启动应用程序的形式(即关闭时停止程序的形式,即Application.Run()的参数的形式)负责其他形式.你有一个主要形式,并且有多个子表单.如果你的情况真的不同,那么可能会有更聪明的东西来写,但这取决于你的情况.我不认为可以为形式管理的一般问题提供一般的好的答案. 老实说,如果你想要一些真正可维护的东西,尽量减少(尽可能地)同时显示的表单数量.多个显示的无模式表单在大多数情况下不会提供良好的用户体验,如果表单相互依赖,则形式的生命周期管理可能是有问题的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |