我有两个窗体,主窗体和子窗体。当 mainForm 失去焦点时,我希望 subForm 消失,然后在 mainForm 重新获得焦点时重新出现。我在 mainForm 上使用 Activated 和 Deactivate 事件来跟踪 mainForm 是否有焦点。当 Activated 被触发时,我执行 subForm.Show() 和 Deactivate 相反的操作。我遇到的问题是,当 subForm 获得焦点时,mainForm 消失,因为我不知道如何以编程方式说“当 mainForm 的 Deactivate 事件触发时,让 subForm 消失,除非是因为 subForm 获得焦点。我正在做的事情的全部意义是当 mainForm 失去焦点时使两个窗口消失,因为用户单击另一个应用程序或使用 ALT+TAB 切换。我不想留下子窗体。有没有办法检查 Deactive 是否触发因为属于应用程序的另一个表单获得了焦点,而不是其他应用程序?
class MainForm : Form
{
SubForm subForm = new SubForm();
private void mainForm_Activated(object sender, EventArgs e)
{
this.subForm.Show();
}
private void mainForm_Deactivate(object sender, EventArgs e)
{
this.subForm.Hide()
// I need some logic to make sure that it is only hidden
// when the mainForm loses focus because the user clicked
// some other application in the taskbar and not when the
// subForm itself gains the focus.
}
}
最佳答案
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private Form2 _form2;
private void Form1_Load(object sender, EventArgs e) {
_form2 = new Form2();
_form2.Show();
HandleFocusEvents();
}
private void HandleFocusEvents() {
this.LostFocus += Form_LostFocus;
_form2.LostFocus += Form_LostFocus;
this.GotFocus += Form_GotFocus;
}
private void Form_LostFocus(object sender, EventArgs e) {
if (!_form2.ContainsFocus && !this.ContainsFocus) {
_form2.Hide();
}
}
private void Form_GotFocus(object sender, EventArgs e) {
if (!_form2.Visible) {
_form2.Show();
}
}
}
关于C# 表单激活和停用事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13042166/