0

我正在制作工具箱类型的东西。无模式对话框应位于屏幕顶部并提供选择选项,然后主窗体应根据按下的按钮执行选项。如何确定从主窗体的无模式对话框中选择了哪个按钮?

4

1 回答 1

0

您在连接到每个按钮的无模式对话框上有一个事件处理程序。单击/切换按钮时,将触发此事件处理程序,从而告诉您该按钮已单击/切换。

然后,您可能希望将此通知转发到您的父窗口。您可以通过在主窗体上调用事件处理程序来完成此操作,将当前选定按钮的标识符作为事件参数的一部分传递。这里唯一棘手的部分是,为了调用主窗体上的事件处理程序,浮动调色板窗体必须保持对主窗体的引用。您可以手动执行此操作,但没有必要这样做,因为浮动调色板始终需要由主对话框拥有(以确保它实际上以 Z 顺序浮动在其顶部),因此您可以简单地使用浮动调色板检索对主对话框的引用Owner财产。将其转换为主窗体的类型,并引发事件。在为主表单类定义的事件处理函数中根据需要处理事件。

如果您不需要在主窗体上接收通知,您可以只跟踪浮动调色板窗体中的状态,并在您需要知道它是什么时从主窗体中读取它。这将要求主窗体保留对浮动调色板的引用。最简单的方法是为包含浮动调色板窗体实例的主窗体类设置一个成员变量。无论如何,这是最好的设计,并且将有助于您从主窗体访问/设置浮动调色板上的数据。它确实略微增加了耦合,有人会说这是面向对象设计的味道,但是这两个对象实际上是非常紧密耦合的,所以这真的不是问题。

您会注意到上面的几个地方我将您的“无模式形式”称为“浮动调色板”。这是因为您所描述的设计实际上是 Photoshop 等具有浮动调色板窗口的复杂应用程序中相当常见的场景,您可以从中选择工具。Paint.NET(用 C# 编写)也确实做到了这一点,并且可能像我所描述的那样实现它。

让新 C# 程序员绊倒的最大事情是理解和类实例之间的区别。类是一个抽象对象——它包含创建对象所需的所有信息。实例是实际对象本身。每个类类型只有一个类定义,但每个类类型可以有多个实例/对象。例如,假设您有一个名为 的主表单类MainForm。这包含主窗体的所有代码(事件、属性、方法等)。这是一堂课。为了实际显示主窗体或与主窗体交互,您需要创建该主窗体的实例MainForm班级。初学者遇到的问题是试图访问类本身的属性或调用函数,而不是类的实例(对象)。这就是为什么我要小心地说您需要维护对浮动调色板的引用——我的意思是您的浮动调色板表单类的特定实例。确保您了解这种区别;有关更多信息,请参阅您最喜欢的有关 C#(或任何其他面向对象语言)编程的文本。

于 2016-11-27T11:29:20.387 回答