gpt4 book ai didi

c# - Application.OpenForms.Count = 0 总是

转载 作者:IT王子 更新时间:2023-10-29 04:53:08 29 4
gpt4 key购买 nike

我有这种情况。Application.OpenForms 没有返回正确的结果。即 Application.OpenForms.Count = 0 始终..

获取表单的目的是获取表单的所有者,以便我可以将所有者作为 MessageBox.Show() 函数的参数传递。

最佳答案

Windows 窗体中存在一个错误,它会使一个窗体从 Application.OpenForms 集合中消失。当您在创建窗口后分配 ShowInTaskbar、FormBorderStyle、ControlBox、Min/MaximizedBox、RightToLeftLayout、HelpButton、Opacity、TransparencyKey、ShowIcon 或 MdiParent 属性时,就会发生这种情况。这些属性的特殊之处在于它们在 native CreateWindowEx() 调用中被指定为样式标志。此示例表单演示了错误:

public partial class Form1 : Form {
public Form1() {
InitializeComponent();
button1.Click += button1_Click;
}
private void button1_Click(object sender, EventArgs e) {
Console.WriteLine(Application.OpenForms.Count);
this.ShowInTaskbar = !this.ShowInTaskbar;
Console.WriteLine(Application.OpenForms.Count);
}
}

Windows 窗体必须再次调用 CreateWindowEx() 以使更改的属性生效,传递不同的样式标志。首先销毁原始窗口会产生非常明显的闪烁之外的副作用,其中之一是 Application 类失去对窗体的跟踪,因为它看到窗口消失了。有一个错误,它不会在创建新窗口时将其添加回去。通过仅在构造函数(调用 CreateWindowEx() 之前运行的代码)而不是任何事件处理程序中设置属性来避免错误。

一般来说,由于这个错误,避免依赖 OpenForms。通过其构造函数为需要显示消息框的类提供对表单实例的引用。 MessageBox 通常会自己正确地计算出父窗口,顺便说一句,它会选择事件窗口,并且在 99% 的情况下都是正确的。如果您需要它从工作线程调用 BeginInvoke(),请确保在您的构造函数中复制 SynchronizationContext.Current 并稍后调用其 Post() 方法。确保您的库也可以与其他 GUI 类库一起使用。

关于c# - Application.OpenForms.Count = 0 总是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3751554/

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