在System.Windows.Forms.Form中,在OnShown覆盖(或Shown事件处理程序)中对OnShown进行的任何修改都会在事件发生后消失。例如,在下面的代码中,当双击表单时,它将显示“启动!”在标题中,数据实际上被修改为“你好,世界!”当表格显示出来的时候。
如果覆盖应用于OnLoad而不是OnShown,则双击将按预期显示消息(“Hello,World!”)。
...
using System.Runtime.Remoting.Messaging;
...
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
CallContext.SetData("Message", "Starting Up!");
}
public string Message
{
get
{
return CallContext.GetData("Message") as string;
}
}
protected override void OnShown(EventArgs e)
{
CallContext.SetData("Message", "Hello, World!");
base.OnShown(e);
}
protected override void OnDoubleClick(EventArgs e)
{
this.Text = this.Message;
base.OnDoubleClick(e);
}
}有人能解释一下这种行为的原因吗?(或者仅仅是我的电脑,做自己的事情?)
.Net Framework4.6.1 (Visual 2015)在Windows7 x64中进行了尝试;目标平台是x86 (x64或AnyCPU没有运气);[STAThread]应用于Main()。
发布于 2016-03-29 18:22:35
行为是正常的。当您使用Form.BeginInvoke调用方法时,它将使用捕获的ExecutionContext来运行该方法,在此之后您在CallContext中所做的更改是不可见的。
如果您查看Form的源代码,您将看到在CallShownEvent方法中调用OnShown,该方法在OnLoad方法中使用BeginInvoke调用,因此CallContext中的更改是OnShown方法的本地更改,在当前上下文中不可见。
public class Form : ContainerControl
{
...
protected virtual void OnLoad(EventArgs e)
{
...
this.BeginInvoke(new MethodInvoker(CallShownEvent));
...
}
private void CallShownEvent()
{
OnShown(EventArgs.Empty);
}
...
}https://stackoverflow.com/questions/36194160
复制相似问题