c# wpf delegates dispatcher

Error en C#: "Se requiere una referencia de objeto para el campo, método o propiedad no estáticos"



wpf delegates (1)

Escribí el código en WPF. En primer lugar, escribí un proyecto separado para probar el trabajo con un dispositivo de puerto COM , y funcionó bien. Luego decidí integrarlo en otro proyecto, pero recibí un error. No cambié el código; Acabo de copiarlo en un nuevo archivo de código.

Este código funciona bien:

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

Pero este no quiere trabajar, y no puedo entender por qué:

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:

Se requiere una referencia de objeto para el campo, método o propiedad no estático ''System.Windows.Threading.Dispatcher.Invoke (System.Windows.Threading.DispatcherPriority, System.Delegate, object)'' E: / C # / PresidentProtocol / PresidentProtocol / classes / QRCodeReader.cs

en esta línea de código:

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


En el primer código, se encuentra en una clase que hereda de Window , por lo que tiene una propiedad Dispatcher en el alcance, que devuelve una instancia de Dispatcher . En el segundo código, estás en la clase QRBarCode , que no tiene una propiedad Dispatcher ; por lo que el compilador supone que se refiere al tipo de Dispatcher e intenta llamar a Invoke en este tipo, pero como no es un método estático, no se puede Invoke directamente sobre el tipo.

Necesita una instancia de Dispatcher para llamar a Invoke ; puedes usar el de la aplicación:

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