在Main from中以无模式形式确定所选按钮

时间:2016-11-27 11:12:06

标签: c# transfer modeless

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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