System.Windows.Forms.Form
では、OnShown
オーバーライド(またはShown
イベントハンドラ)のCallContext
に対して行われた変更は、イベント後に消えます。たとえば、次のコードでは、フォーム上でダブルクリックすると、「Starting Up!」と表示されます。データが実際に 'Hello、World!'に変更されている間はタイトルになりますフォームが表示されたとき。OnShownハンドラのCallContextへの変更が維持されない
OnShown
の代わりにOnLoad
にオーバーライドを適用した場合、ダブルクリックするとメッセージが正常に表示されます( '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);
}
}
誰かがこの動作の理由を説明できますか? (あるいは、それはちょうど私のPC、それ自身のことをやっているのですか?)
これは4.6.1(Visual Studioの2015)のWindows 7のx64での.NET Frameworkでみました。ターゲットプラットフォームはx86です(x64またはAnyCPUでは不運です)。 [STAThread]
はMain()
に適用されます。
動作は正常です。 'Form.BeginInvoke'を使ってメソッドを呼び出すと、キャプチャされた' ExecutionContext'を使ってメソッドを実行し、 'CallContext'で行った変更はそれ以降は表示されません。 'Form'のソースコードを見ると、' OnLown'(http://referencesource.microsoft.com)の 'BeginInvoke'を使って呼び出される' CallShownEvent'メソッドで 'OnShown'が呼び出されます。 'System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs、4906)メソッドであるため、' CallContext'の変更は 'OnShown'メソッドに対してローカルであり、現在のコンテキストでは表示されません。 –
@ reza-aghaei入手しました。ありがとうございました...それは答えです...私は 'OnLoad'の終わりにCallShownEventの' BeginInvoke'を見逃しました... – Raje