web-dev-qa-db-ja.com

C#のエラー:「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です」

WPFでコードを記述しました。最初に、 COMポート デバイスでの動作をテストする別のプロジェクトを作成しましたが、うまく機能しました。次に、別のプロジェクトに統合することにしましたが、エラーが発生します。コードは変更しませんでした。新しいコードファイルにコピーしています。

このコードはうまく機能します:

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

しかし、これは動作したくないので、理由がわかりません。

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

エラー:

非静的フィールド、メソッド、またはプロパティ 'System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority、System.Delegate、object)'にはオブジェクト参照が必要ですE:\ C#\ PresidentProtocol\PresidentProtocol\classes\QRCodeReader.cs

このコード行で:

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

最初のコードでは、Windowから継承するクラスにいるため、Dispatcherプロパティがスコープにあり、Dispatcherのインスタンスを返します。 2番目のコードでは、QRBarCodeクラスを使用していますが、これにはDispatcherプロパティがありません。したがって、コンパイラはDispatcher型を参照していると想定し、この型でInvokeを呼び出そうとしますが、これは静的メソッドではないため、型で直接呼び出すことはできません。

Dispatcherを呼び出すには、Invokeのインスタンスが必要です。あなたはアプリケーションからのものを使うことができます:

Application.Current.Dispatcher.Invoke(...);
45
Thomas Levesque