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(...);