2016-03-09 6 views
6

क्यों Application.Current WinForms एप्लिकेशन में शून्य के लिए बाहर आते हैं? यह कब और कब सेट किया जाना चाहिए?एप्लिकेशन.क्यूरेंट == WinForms एप्लिकेशन में शून्य क्यों है?

मैं कर रहा हूँ:

static class Program { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() { 
      Application.Run(new MainForm()); 
     } 
    } 
+2

कोई 'System.Windows.Forms.Aplication.Current' प्रॉपर्टी नहीं है। क्या आप डब्ल्यूपीएफ के साथ मिश्रण कर रहे हैं? –

+0

यह इस प्रश्न के लिए पृष्ठभूमि है और मैं यहां समाधान को लागू करने की कोशिश कर रहा हूं: http://stackoverflow.com/questions/35901454/how-to-raise-onpropertychanged-on-a-gui-thread-when-an- ऑब्जेक्ट-प्रॉपर्टी-is-modifi – Denis

+2

मेरे द्वारा देखे गए लिंक किए गए प्रश्न का एकमात्र उत्तर * WPF *** के लिए * से शुरू होता है। –

उत्तर

12

आवेदन। वर्तमान WPF अनुप्रयोग के लिए विशिष्ट है। इसलिए जब आप WinForms एप्लिकेशन में WPF नियंत्रण का उपयोग कर रहे हैं तो आपको WPF एप्लिकेशन के उदाहरण को प्रारंभ करने की आवश्यकता है। अपने WinForms एप्लिकेशन में ऐसा करें।

if (null == System.Windows.Application.Current) 
{ 
    new System.Windows.Application(); 
} 
+17

कुछ समय बीतने के बाद से मैंने सी # में योड की स्थिति देखी है। –

+0

महान उत्तर के लिए बहुत बहुत धन्यवाद – smoothumut

+0

मदद नहीं करता है ?? – Moumit

1

यह अन्य तो सवाल के आधार पर, Application.Current एक WPF सुविधा और नहीं एक WinForm सुविधा है।

1.In:

आप पहली बार PresentationFramework के लिए एक संदर्भ जोड़ सकते हैं:

Application.Current Question

वहाँ

एक MSDN post से पता चलता है कि अपने कोड के लिए कुछ संदर्भ जोड़कर Winform में सुविधा का लाभ उठा करने के लिए कैसे है समाधान एक्सप्लोरर, प्रोजेक्ट नोड पर राइट-क्लिक करें और संदर्भ जोड़ें पर क्लिक करें।

2. संदर्भ जोड़ें संवाद बॉक्स में, .NET टैब का चयन करें।

3. प्रस्तुति फ़्रेमवर्क का चयन करें, और उसके बाद ठीकक्लिक करें।

4. "सिस्टम का उपयोग करके। Windows.Shell;" और "सिस्टम का उपयोग कर। विन्डोज़;" आपके कोड में

1

खैर IMHO राय अन्य एसओ का जवाब नहीं वास्तव में खिड़कियों रूपों के लिए जाने का रास्ता है, हालांकि शायद गलत नहीं है।

आम तौर पर आप WinForms में ऐसी सुविधा के लिए ISynchronizeInvoke का उपयोग करेंगे। प्रत्येक कंटेनर नियंत्रण इस इंटरफ़ेस को लागू करता है।

आपको उचित थ्रेड पर कॉल को मार्शल करने के लिए BeginInvoke() विधि की आवश्यकता होगी।

अपने पिछले प्रश्न के आधार पर कोड बन जाएगा:

public class SomeObject : INotifyPropertyChanged 
{ 
    private readonly ISynchronizeInvoke invoker; 
    public SomeObject(ISynchronizeInvoke invoker) 
    { 
     this.invoker = invoker; 
    } 

    public decimal AlertLevel 
    { 
     get { return alertLevel; } 
     set 
     { 
      if (alertLevel == value) return; 
      alertLevel = value; 
      OnPropertyChanged("AlertLevel"); 
     } 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      this.invoker.BeginInvoke((Action)(() => 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName))), null); 

     } 
    } 
} 

कहाँ SomeObject के निर्माता के लिए मालिक Form वर्ग गुजरती हैं। PropertyChanged अब मालिक फॉर्म वर्ग के यूआई थ्रेड पर उठाया जाएगा।

संबंधित मुद्दे