gpt4 book ai didi

.net - UserControl 句柄多久重新创建一次?

转载 作者:行者123 更新时间:2023-12-04 07:58:22 25 4
gpt4 key购买 nike

我在 msdn 上查找了 winforms 的 UserControl.Load 事件(找到 here )并看到了这条警告消息:

The Load event occurs when the handle for the UserControl is created. In some circumstances, this can cause the Load event to occur more than one time. For example, the Load event occurs when the UserControl is loaded, and again if the handle is recreated. (One way that a handle is recreated is by calling the RecreateHandle method.) To account for the Load event occurring more than one time, you should put any one time initialization code in the UserControl constructor instead of a Load event handler. In addition, you should not add data bindings to the UserControl in a Load event handler.



那么我的问题是,除了显式调用 RecreateHandle 之外,还有什么会导致为 UserControl 重新创建句柄?在阅读本文之前,我总是将任何应该只发生一次的事情放在 Load 事件中。另外(从最后一句话),添加数据绑定(bind)的最佳位置在哪里?如果我不打算调用 RecreateHandle 真的很重要吗?

最佳答案

是的,这是可能的。它是由 native Windows CreateWindowEx() API 函数的问题引起的。该调用指定窗口的样式位。这些相同的样式位也作为控件的属性公开。问题是,更改该属性需要再次调用 CreateWindowEx()。控件的 native Windows 窗口被销毁并重新创建。这有副作用,其中之一是让 Load 事件再次运行。

使用代码示例进行演示:

public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
}
public void TriggerRecreate() {
if (this.RightToLeft == System.Windows.Forms.RightToLeft.Yes)
this.RightToLeft = System.Windows.Forms.RightToLeft.No;
else this.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
}
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
Console.WriteLine("onload");
}
}

编译并将控件放到窗体上。添加一个按钮:
    private void button1_Click(object sender, EventArgs e) {
userControl11.TriggerRecreate();
}

并观察每次单击按钮时输出窗口都会显示“onload”。

RightToLeft 属性是我能想到的唯一一个用于执行此操作的 UserControl。表格还有很多。然而,该类有专门的代码来防止其 OnLoad 方法运行不止一次。不知道他们为什么不为 UserControl 这样做,可能是因为它非常罕见。随意忽略它。除非您关心窗口大小,否则始终支持构造函数而不是 Load 事件。

关于.net - UserControl 句柄多久重新创建一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796067/

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