我有一个Form(form3),可以从另外两个表单中打开。 Form1和Form2。
我怎样才能知道哪个是form3的父母?
最佳答案
在Windows中,“父母”一词有非常严格的定义。 Form类就像所有UI类一样从Control派生而来,但是它非常独特,它是一个顶层窗口。与其他控件(如Button和TextBox)非常不同,它们是父窗口中的子窗口。窗体的父级是桌面窗口,您不太可能对此感兴趣。
因此,谈论“ Form3的父代”是毫无意义的,它与Form1和Form2是同一个父代,根本无法帮助您区分哪个人显示了Form3窗口。
Windows确实具有将两个顶级窗口彼此关联的方法,它具有所有者窗口的概念。它旨在实现工具窗口或对话框,拥有的窗口始终显示在其所有者的顶部,并与所有者一起最小化。创建一个拥有的窗口很简单:
var toolWindow = new Form3();
toolWindow.Show(this);
这个Show()重载采用一个表明其所有者的参数,该参数可以是对Form1或Form2对象的引用,具体取决于此代码的显示位置。在Form3类中,您可以使用Owner属性找到所有者。
Winforms经常是程序员对面向对象程序设计的首次介绍,而处理对象引用常常令人困惑,因此您真正谈论的内容几乎不太可能。如果需要在Form3中引用逻辑父级,则只需编写代码,以便传递该父级。通过为Form3类提供构造函数来执行以下操作:
private Form logicalParent;
public Form3(Form parent) {
InitializeComponent();
logicalParent = parent;
}
在Form1或Form2中创建窗口仅需:
var form = new Form3(this);
form.Show();
您可以通过为Form1和Form2设计一个基类来进一步改进此代码,该基类具有与Form3这样的类感兴趣的成员。或者更好的是,Form1和Form2都实现了一个接口,大大减少了耦合。最后但并非最不重要的一点是,使用事件允许Form3通知其逻辑父级。可能是您真正想要的东西。