代码之家  ›  专栏  ›  技术社区  ›  esac

通过窗体显示窗体。显示没有焦点?

  •  1
  • esac  · 技术社区  · 14 年前

    我有两个表单,Form1和一个托管Form2的用户控件。在Form1上的那个用户控件中,我调用 Form2.Show(); . 我也试过 Form2.Show(this); . 不管怎样,焦点都不在形式上。我必须在新表单中单击一次以使其聚焦,然后才能单击该表单中的项。

    我认为控件正在传递回主控件/窗体,因此焦点正在丢失。所以我一直等到2号表格通过:

          while (form2.Visible == true)
          {
              System.Threading.Thread.Sleep(100);
              Application.DoEvents();
          }    
    

    这似乎管用。然而,在我关闭表单之后,现在反过来也成立了。表单1没有焦点(即使我调用 this.Focus() )直到我在主窗体窗口中单击一次。

    有什么办法处理好的吗。我想显示一个子窗体(无模式),并且立即可以单击它,当该窗体关闭时,立即可以对父窗体执行操作。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Aren    14 年前

    你应该用 .ShowDialog() ,如果用户正确执行了Form2的操作或提前中止了操作,也可以对此进行扩展以给出您的响应。

    这会使窗体在前面锁定焦点,并在关闭该窗体之前停止对第一个窗体的代码执行。

        2
  •  1
  •   Javed Akram    14 年前

    使用 this.Activate(); 代替 this.Focus();

        3
  •  0
  •   Jay Riggs    14 年前

    我不确定我是否完全理解,但是从你的UC尝试像这样打开窗体2:

    form2.Show(Parent);
    

    这应该指定UC的父窗体为 form2 的所有者。

        4
  •  0
  •   esac    14 年前

    这是因为我为了显示表单而重写了WndProc。当我收到CBN_下拉消息时,我会显示表单。我改为调用显示窗体的方法来修复它。

    case CBN_DROPDOWN:
        Invoke(new MethodInvoker(Show_DropDown));
        return;