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);
möglich Duplikat [Dispatcher.BeginInvoke Probleme] (http://stackoverflow.com/questions/2596801/dispatcher-begininvoke-problems) – Heslacher