2016-03-24 25 views
0

devamlı değildir, OnShown geçersiz kılma (veya Shown olayı işleyicisinin) içerisinde CallContext için yapılan herhangi bir değişiklik, bir olay sonra kaybolur. Örneğin, aşağıdaki kodda, forma çift tıklandığında, 'Başlıyor!' verilerde aslında 'Merhaba, Dünya!' form gösterildiğinde.değişiklikler bir <code>System.Windows.Forms.Form</code> olarak

Geçersiz kılma, OnShown yerine OnLoad'a uygulanırsa, çift tıklatıldığında iletinin beklendiği gibi gösterilir ('Merhaba, Dünya!').

... 
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); 
    } 
} 

Birisi bu davranışın nedenini açıklayabilir mi? (Ya da sadece benim PC, o kendi şeyler yapıyor nedir?)


Bu 4.6.1 (Visual Studio 2015), Windows 7 x64 de .Net Framework denendi; Hedef Platform x86'dır (x64 veya AnyCPU ile şans yok); [STAThread], Main()'a uygulanır.

+1

Davranış normaldir. Form.BeginInvoke işlevini kullanarak bir yöntem çağırdığınızda, yöntemi çalıştırmak için yakalanan bir 'ExecutionContext' kullanır ve 'CallContext' içinde yaptığınız değişiklikler bundan sonra görünmez. Eğer 'Form' için kaynak koduna bakarsanız, '' OnShown' '' 'OnLoad' '' (http://referencesource.microsoft) içinde' BeginInvoke' kullanılarak çağrılan 'CallShownEvent' yönteminde çağrılır. com/# System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs, 4906) 'CallContext' yönteminde yapılan değişiklikler, 'OnShown' yöntemine yereldir ve geçerli bağlamda görünmez. –

+0

@ reza-aghaei Anladım; teşekkür ederim ... Bu cevap ... 'OnLoad' sonunda CallShownEvent için' BeginInvoke' özledim ... – Raje

cevap

1

Davranış normaldir. Form.BeginInvoke kullanarak bir yöntemi çağırdığınızda, yöntemi çalıştırmak için yakalanan bir ExecutionContext kullanır ve CallContext içinde yaptığınız değişiklikler bundan sonra görünmez. Eğer Form için kaynak koduna bir göz atacak olursak

, sen OnShownOnLoad yönteminde BeginInvoke kullanarak ve böylece CallContext değişiklikler OnShown yönteme yerel ve geçerli bağlamda görünmez denir CallShownEvent yöntemde denir göreceksiniz.

public class Form : ContainerControl 
{ 
    ... 
    protected virtual void OnLoad(EventArgs e) 
    { 
     ... 
     this.BeginInvoke(new MethodInvoker(CallShownEvent)); 
     ... 
    } 
    private void CallShownEvent() 
    { 
     OnShown(EventArgs.Empty); 
    } 
    ... 
} 
İlgili konular