如何响应大型表单
本文关键字:大型 表单 响应 何响应 | 更新日期: 2023-09-27 18:07:23
我一直在研究MVC和MVP,但我不确定它们是否是我想要的。
我目前有很多模型对象和我的视图是主要的形式(Form1.cs)
问题是现在的主要形式变得非常大。例如,当用户点击undo菜单项时,将调用undoButton_Click事件处理程序。这很好。问题是,在这个事件处理程序的代码是10行(弹出undoStack,推动redoStack,更新表单控件,等等)。这可能听起来不多,但是当窗体上有许多控件时,行数很快就会增加。
我一直在想这件事,我想要一个简单的解决方案。理想情况下,当调用undoButton_Click时,方法体应该是一行代码。理想情况下,应该有一个类(可能派生自定义单个Run方法的接口或类似的东西),我将能够调用它来执行这个撤销。问题是undoButton_Click操作许多表单控件和类的成员变量。这个类如何访问这些控件?我不能将表单作为参数传递,因为所有控件都是私有的。我真的不想让所有控件都是公共的,或者提供大量的公共属性来访问它们。即使我这样做了,Form1的成员变量,比如undoStack或文档对象呢?
传递所有需要的实参是完全不可行的,因为形参列表会非常大,如果需要进行更改,那将是一场噩梦。
我不知道该如何处理这个问题。我所知道的是,我的Form1.cs是方式太混乱的逻辑和对象的操作。我只是想让它响应事件,并调用相应的方法/类来处理事件。
谢谢你的阅读,对不起,我的文字墙。
我有一个非常相似的问题。我的解决方案是为我的MainForm创建部分类。我有一个用于事件处理程序,一个用于鼠标处理,一个用于键盘处理等等。
我还将一些在许多地方使用的实用程序方法重构到一个单独的静态类中。
我还有另一个局部类,用于整个项目中使用的字段。最后,我对一些字段和属性使用静态类来减少向方法传递参数。我相信有些人会告诉我这是不好的做法,但它对我有效。
最后,我使用Visual Studio的插件来计算代码的复杂性或可维护性,然后将那些大型或复杂的方法重构为较小的方法。
我不太明白你的代码应该做什么,但是你应该把你的代码分成更小的方法,这些方法代码很短,每个方法只做一些特定的动作。当你达到那个层次时,你会看到哪些可以用于几个控件,哪些只能用于一个控件。此外,您将看到它们每个都需要什么参数,然后您将有一个线索,其中哪些可以在一个单独的类中,哪些可以作为一个控件的私有方法,哪些将需要一个专用方法的私有字段。祝你好运,成功。
我会添加ControlUndo
类与ctor
ControlUndo(Form parentform, string controlname, string property)
.
窗体上的每个control
通过将其父窗体的名称和属性名称传递给tor来声明其不可撤消的属性。
ControlUndo有一个方法Undo()
,从Controls
集合的父形式找到一个Control
对象,使用反射找到一个属性来撤销和恢复值。
在新的ControlUndo
被添加到可撤销对象的全局集合之后。当Undo
on form调用时,您只需要为集合中的每个元素调用Undo()
。
UI呢?
如果表单上有很多控件,user
几乎不可能同时需要它们。所以你可以根据你的应用逻辑将它们划分为不同的TabPages
,通过在表单上放置所有控件,但限制UI
内容在最重要的事情上用户需要在那个精确的时刻。
您应该尝试从UI层中删除尽可能多的逻辑。当您需要执行业务逻辑时,该逻辑应该位于业务层中。UI应该只知道如何可视化地表示各种数据,并向业务层发出命令。您不需要使用MVC来实现这一点。
从概念上讲,考虑一个Person类。它将有一组属性(姓名、地址、狗的名字)。您的UI将有一组文本框,以及对它所代表的person实例的引用。当对文本框进行更改时,更改将应用于person实例。当您想要撤销时,您可以在person对象上调用撤销,然后由该对象来恢复到以前的状态(并允许重新执行)。撤销完成后,UI将把新值放入文本框中,但它不应该关心实际的撤销或重新执行。这可以手动实现,也可以使用。net中的内置数据绑定机制。我的主要观点是这样的;尽可能地将你的逻辑与你的UI分离开来,那么Form就只会在屏幕上显示内容,并发出命令。每当SQL语句或计算开始出现在按钮的单击处理程序中时,您就走错了路。
在Undo的具体示例中,您应该查看纪念品设计模式(这里和这里)