gpt4 book ai didi

c# - 设置窗体的 MdiParent 属性会中断/阻止触发其 Shown 事件

转载 作者:行者123 更新时间:2023-12-04 02:10:36 26 4
gpt4 key购买 nike

所以,我一直在 stackoverflow 和其他互联网论坛和知识库上搜索类似的主题,但到目前为止,我一直没有解决这个问题,我已经苦苦挣扎了整整一个星期。这是代码:

    private void matrículasToolStripMenuItem_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1();
form1.Show();
form1.MdiParent = this; // this == the main form of the aplication, wich has IsMdiParent property set to true.
}

如果我取出“form1.MdiParent = this”,form1 的显示事件将正常触发,执行其所有处理程序的内容,但如果我让它在那里,form1 的显示事件将不会触发(我确实设置了断点,没有一个被触发)。

奇怪的是,如果我使用 Load 事件而不是 Shown,一切正常,但我有点担心如果将 Shown 换成 Load 会破坏某些东西:(。

最佳答案

试试这段代码

 Form1 form1 = new Form1();
//Subscribe event here
form1.MdiParent = this;
form1.Show();

这对我有用

我不知道为什么你的代码不起作用,我会在得到答案后回来。

编辑:我现在得到了答案。

ISynchronizationInvoke 的 成员(InvokeBeginInvoke)由Control 类实现如下。

  1. 获取创建窗口的线程的上下文。
  2. 使用 RegisterWindowMessage 生成新的窗口 messageId
  3. 将我们作为参数传递的委托(delegate)封装在ThreadMethodEntry中添加到控件内部的Queue
  4. 使用 RegisterWindowMessage 使用 PostMessage 返回的 messageId 将消息发布到线程队列
  5. 处理 WndProc 监听 messageId,然后将 ThreadMethodEntry 出队并调用委托(delegate)。

What goes wrong here?

Form1 form1 = new Form1(); form1.Show(); form1.MdiParent = this;

Form.Show 以某种方式导致调用 OnLoad 方法,即使用 BeginInvoke OnShown 的地方

if (base.IsHandleCreated)
{
base.BeginInvoke(new MethodInvoker(this.CallShownEvent));//reflected code
}

因此,在发送的 WindowMessage 收到您设置 form1.MdiParent = this; 之后,这反过来会强制控件 Destroy 它的句柄和 ReCreate 新句柄。

DestroyHandle 方法通过使用 PeekMessage 函数获取已发布的消息,然后枚举 Queue 中的所有元素并将其状态设置为已完成不调用委托(delegate)但将其标记为抛出 ObjectDisposedException

Form1 form1 = new Form1();
form1.Show();
Action del = () =>
{
Console.WriteLine("This will never be called");//our custom delegates too fails to be invoked
};
var res = form1.BeginInvoke(del);
//after some more code
form1.EndInvoke(res);//throws `ObjectDisposedException` which was marked previously
form1.MdiParent = this;

抛出 ObjectDisposedException("Control") 实际上是误导,不是吗?

注意:您可以在 form1.MdiParent = this; 之前使用 Application.DoEvents(); 轻松解决此问题,因为 DoEvents 处理所有立即等待消息。

关于c# - 设置窗体的 MdiParent 属性会中断/阻止触发其 Shown 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com