在 Main From 中确定无模式窗体中的选定按钮

Determining A Selected Button In a Modeless Form In the Main From

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

您在连接到每个按钮的无模式对话框上有一个事件处理程序。当按钮为 clicked/toggled 时,此事件处理程序将触发,从而告诉您该按钮为 clicked/toggled.

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

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

您会注意到上面的几个地方我将您的 "modeless form" 称为 "floating palette"。那是因为您所描述的设计实际上是复杂应用程序(如 Photoshop)中相当常见的场景,这些应用程序具有浮动调色板 windows,您可以从中选择工具。 Paint.NET(用 C# 编写)也正是这样做的,并且可能像我描述的那样实现它。

让 C# 新手感到困惑的最大事情是理解 class 实例 之间的区别class。 class 是一个抽象 object — 它包含创建 object 的所有必要信息。该实例是实际的 object 本身。每个 class 类型只有一个 class 定义,但每个 class 类型可以有多个 instances/objects 定义。例如,假设您有一个名为 MainForm 的主窗体 class。这包含您的主窗体的所有代码(事件、属性、方法等)。这是一个class。为了实际 displayinteract 与您的主窗体,您需要创建一个 instance MainForm class。初学者遇到的问题是试图访问 class 本身 的属性或调用函数,而不是 实例 ([= class 的 71=])。这就是为什么我要小心地说你需要维护对浮动调色板的引用——我的意思是你的浮动调色板形式 class 的特定 实例 。确保您理解这种区别;有关更多信息,请参阅您最喜欢的有关 C#(或任何其他 object-oriented 语言)编程的文本。