I wrote code in WPF. Firstly, I wrote a separate project to test work with a COM port device, and it worked well. Next I decided to integrate it in another project, but I get an error. I didn't change the code; I am just copied it into a new code file.
This code works well:
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'); } } } }
But this one doesn't want to work, and I can't understand why:
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); } } }
Error:
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
on this line of code:
Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data);
When developing programs there are three types of error that can occur: syntax errors. logic errors. runtime errors.
In the first code, you are in a class that inherits from Window
, so you have a Dispatcher
property in scope, which returns an instance of Dispatcher
. In the second code, you're in the QRBarCode
class, which doesn't have a Dispatcher
property; so the compiler assumes you're referring to the Dispatcher
type, and tries to call Invoke
on this type, but since it's not a static method, it can't be called directly on the type.
You need an instance of Dispatcher
to call Invoke
; you can use the one from the application:
Application.Current.Dispatcher.Invoke(...);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With