2013-09-06 3 views
13

Ich schrieb Code in WPF. Erstens schrieb ich ein separates Projekt, um die Arbeit mit einem COM port Gerät zu testen, und es funktionierte gut. Als nächstes entschied ich mich, es in ein anderes Projekt zu integrieren, aber ich bekomme einen Fehler. Ich habe den Code nicht geändert; Ich habe es einfach in eine neue Codedatei kopiert.Fehler in C#: "Ein Objektreferenz ist für das nicht statische Feld, Methode oder Eigenschaft erforderlich"

Dieser Code funktioniert gut:

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

Aber das man nicht will arbeiten, und ich kann nicht verstehen, warum:

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

Fehler:

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

Auf dieser Codezeile:

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

möglich Duplikat [Dispatcher.BeginInvoke Probleme] (http://stackoverflow.com/questions/2596801/dispatcher-begininvoke-problems) – Heslacher

Antwort

32

Im ersten Code befinden Sie sich in einer Klasse, die von Window erbt. Sie haben also eine -Eigenschaft im Gültigkeitsbereich, die eine Instanz von zurückgibt. Im zweiten Code befinden Sie sich in der Klasse QRBarCode, die keine -Eigenschaft besitzt. Der Compiler geht also davon aus, dass Sie sich auf den Typ beziehen, und versucht, Invoke für diesen Typ aufzurufen, da es sich jedoch nicht um eine statische Methode handelt, kann er nicht direkt auf dem Typ aufgerufen werden.

Sie benötigen eine Instanz von , um Invoke aufzurufen; Sie können den einen aus der Anwendung verwenden:

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