2016-03-24 17 views
0

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()に適用されます。

+1

動作は正常です。 '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'メソッドに対してローカルであり、現在のコンテキストでは表示されません。 –

+0

@ reza-aghaei入手しました。ありがとうございました...それは答えです...私は 'OnLoad'の終わりにCallShownEventの' BeginInvoke'を見逃しました... – Raje

答えて

1

動作は正常です。 Form.BeginInvokeを使用してメソッドを呼び出すと、キャプチャされたExecutionContextを使用してメソッドが実行され、CallContextで行った変更は表示されません。あなたはFormのソースコードを見てみた場合

、あなたはOnShownOnLoad方法でBeginInvokeを使用し、そうCallContextの変化はOnShownメソッドに対してローカルであり、現在のコンテキストで表示されていないと呼ばれているCallShownEventメソッドで呼び出され表示されます。

public class Form : ContainerControl 
{ 
    ... 
    protected virtual void OnLoad(EventArgs e) 
    { 
     ... 
     this.BeginInvoke(new MethodInvoker(CallShownEvent)); 
     ... 
    } 
    private void CallShownEvent() 
    { 
     OnShown(EventArgs.Empty); 
    } 
    ... 
} 
関連する問題