2013-09-06 27 views
13

WPF'ye kod yazdım. İlk olarak, COM port cihazıyla çalışmayı test etmek için ayrı bir proje yazdım ve iyi çalıştı. Sonra başka bir projeye entegre etmeye karar verdim, ama bir hata alıyorum. Kodu değiştirmedim; Sadece yeni bir kod dosyasına kopyaladım.C# içinde hata: "Statik olmayan alan, yöntem veya özellik için bir nesne başvurusu gerekli"

Bu kod iyi çalışıyor:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.IO.Ports; 
using System.Windows.Threading; 

namespace WpfApplication2 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      serial.BaudRate = 9600; 
      serial.Handshake = System.IO.Ports.Handshake.None; 
      serial.Parity = Parity.None; 
      serial.DataBits = 8; 
      serial.StopBits = StopBits.One; 
      serial.ReadTimeout = 200; 
      serial.WriteTimeout = 500; 
      serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Recieve); 
     } 

     SerialPort serial = new SerialPort(); 
     private string recieved_data; 

     private delegate void UpdateUiTextDelegate(string text); 

     private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     { 
      if (serial.IsOpen) 
      { 
       try 
       { 
        recieved_data = serial.ReadLine(); 
        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.ToString()); 
       } 
      } 
     } 

     private void DisplayText(string code) 
     { 
      textBox1.AppendText(string1); 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      ListBoxItem lbi = new ListBoxItem(); 
      lbi = (ListBoxItem)listBox1.SelectedItem; 
      serial.Close(); 
      serial.PortName = "COM" + (string)lbi.Content; 
      try 
      { 
       serial.Open(); 
       textBox1.AppendText("Device opened at " + serial.PortName + '\n'); 
      } 
      catch (Exception ex) 
      { 
       textBox1.AppendText(ex.Message + '\n'); 
      } 
     } 
    } 
} 

Ama bu bir işe istemiyor, ben de anlayamıyorum neden:

using System.IO.Ports; 
using System.Windows.Threading; 
using System; 
using System.Windows; 

namespace PresidentProtocol 
{ 
    public class QRBarCode 
    { 
     // private SerialPort serial = new SerialPort(); 

     public QRBarCode(string com) 
     { 
      serial.BaudRate = 9600; 
      serial.Handshake = System.IO.Ports.Handshake.None; 
      serial.Parity = Parity.None; 
      serial.DataBits = 8; 
      serial.StopBits = StopBits.One; 
      serial.ReadTimeout = 200; 
      serial.WriteTimeout = 500; 
      serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Recieve); 
      serial.Close(); 
      serial.PortName = com; 
      try 
      { 
       serial.Open(); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("Error opening COM port."); 
      } 
     } 

     SerialPort serial = new SerialPort(); 
     private string recieved_data; 


     private delegate void UpdateUiTextDelegate(string text); 

     private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     { 
      if (serial.IsOpen) 
      { 
       try 
       { 
        recieved_data = serial.ReadLine(); 
        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.ToString()); 
       } 
      } 
     } 

     private void DisplayText(string code) 
     { 
      MessageBox.Show(code); 
     } 
    } 
} 

Hata:

An object reference is required for the non-static field, method, or property 'System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority, System.Delegate, object)' E:\C#\PresidentProtocol\PresidentProtocol\classes\QRCodeReader.cs

Bu satırın satırında:

Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data); 
+0

olası yinelenen [Dispatcher.BeginInvoke problemleri] (http://stackoverflow.com/questions/2596801/dispatcher-begininvoke-problems) – Heslacher

cevap

32

İlk kodda, Window'dan miras alan bir sınıftasınız demektir, bu nedenle Dispatcher özelliğine sahip olduğunuz için Dispatcher örneğini döndürür. İkinci kodda, Dispatcher özelliğine sahip olmayan QRBarCode sınıfındasınız; Bu nedenle derleyici, Dispatcher türüne atıfta bulunduğunuzu ve bu türde Invoke'u aramayı denediğini varsayar, ancak bu statik bir yöntem olmadığından, doğrudan türden çağrılmaz.

Invoke'u aramak için Dispatcher örneğine ihtiyacınız vardır; Eğer uygulamadan birini kullanabilirsiniz: ait

Application.Current.Dispatcher.Invoke(...);