C# 从另一个C类更新标签#不工作

C# 从另一个C类更新标签#不工作,c#,wpf,C#,Wpf,所以我正在开发一个软件,可以让我连接到Arduino并控制它。现在,我有了一个方法来处理Arduino的所有代码(串口、波特率、端口名等),一切都很好 现在,我的挑战是:我的窗口中有一个标签,我想更改该标签的内容,以显示软件何时连接到Arduino以及何时断开连接。我有代码,它似乎是正确的,它运行和所有,但它不更新我的标签。我尝试了不同的方法,但仍然不起作用,所以我在其中一个方法中创建了一个MessageBox,该方法应该更新我的标签,当按下按钮(连接按钮)时,该消息框会显示出来,因此该方法起作

所以我正在开发一个软件,可以让我连接到Arduino并控制它。现在,我有了一个方法来处理Arduino的所有代码(串口、波特率、端口名等),一切都很好

现在,我的挑战是:我的窗口中有一个标签,我想更改该标签的内容,以显示软件何时连接到Arduino以及何时断开连接。我有代码,它似乎是正确的,它运行和所有,但它不更新我的标签。我尝试了不同的方法,但仍然不起作用,所以我在其中一个方法中创建了一个MessageBox,该方法应该更新我的标签,当按下按钮(连接按钮)时,该消息框会显示出来,因此该方法起作用,但不应该更新我的标签。你知道我为什么以及如何解决这个问题吗

控制代码:

using System;
using System.IO.Ports;

namespace MyApp
{
    static class ArduinoControl
    {

        static SerialPort sp = new SerialPort();

        //Pentru conectarea la MainWindow;
        static Arduino ard = new Arduino();

        public static bool isConnected = false;    


        public static void ConnectToArduino()
        {
            try
            {

                string portName = ard.tboxPortName.Text;
                sp.PortName = portName;
                sp.BaudRate = 9600;
                sp.Open();
                ard.DisplayConnected();
                isConnected = true;
            }
            catch (Exception)
            {
                System.Windows.MessageBox.Show("Please give a valid port number or check your connection. " +
                    "If the port number is correct but the error persist, please check if your Arduino device is correctly connected.");
            }
        }


        public static void DisconnectFromArduino()
        {
            try
            {
                sp.Close();
                isConnected = false;
                ard.DisplayDisconnected();
            }
            catch (Exception)
            {
                System.Windows.MessageBox.Show("In order to disconnect, you have to connect first to an Arduino device.");
            }
        }


        //in work
        public static bool IsConnected()
        {
            return isConnected;
        }
    }
}
我的窗口中的类位于此处:

using System.Windows;
using System.Windows.Media;

namespace Xander
{
    /// <summary>
    /// Interaction logic for Arduino.xaml
    /// </summary>
    public partial class Arduino : Window
    {
        public Arduino()
        {
            InitializeComponent();
        }


        //Butonul de conectare/deconectare la SerialPort pentru conexiunea la Arduino
        private void btnConnect_Click(object sender, RoutedEventArgs e)
        {
            if (!ArduinoControl.IsConnected())
            {
                ArduinoControl.ConnectToArduino();
            }
            else
            {
                ArduinoControl.DisconnectFromArduino();
            }
        }

        //Butonul de ascundere a ferestrei ArduinoControl
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Hide();
        }

        //TODO - De verificat - NOT WORKING
        public void DisplayConnected()
        {
            //MessageBox.Show("Metoda este rulata");            //WORKING
            btnConnect.Content = "Disconnect";
            lblConnectionStatus.Foreground = Brushes.Green;
            lblConnectionStatus.Content = "Connected";
        }

        //TODO - De verificat - NOT WORKING
        public void DisplayDisconnected()
        {
            btnConnect.Content = "Connect";
            lblConnectionStatus.Foreground = Brushes.Red;
            lblConnectionStatus.Content = "Disconnected";
        }
    }
}
使用System.Windows;
使用System.Windows.Media;
命名空间Xander
{
/// 
///Arduino.xaml的交互逻辑
/// 
公共部分类Arduino:窗口
{
公共阿杜伊诺()
{
初始化组件();
}
//连接/断开连续端口的连接
私有void btn连接\u单击(对象发送方,路由目标)
{
如果(!ArduinoControl.IsConnected())
{
ArduinoControl.ConnectToArduino();
}
其他的
{
ArduinoControl.DisconnectFromArduino();
}
}
//布托诺·德·阿斯康德·费雷斯特里·阿杜伊诺
私有无效按钮\u单击(对象发送者,路由目标e)
{
隐藏();
}
//TODO-取消验证CAT-不工作
公共连接()
{
//MessageBox.Show(“Metoda este rulata”);//正在工作
btnConnect.Content=“断开”;
lblConnectionStatus.前台=画笔.绿色;
lblConnectionStatus.Content=“已连接”;
}
//TODO-取消验证CAT-不工作
public void displaydesconnected()
{
btnConnect.Content=“Connect”;
lblConnectionStatus.前台=画笔.红色;
lblConnectionStatus.Content=“已断开”;
}
}
}

有什么想法吗?

您应该调用您在屏幕上看到的现有窗口实例的方法。这意味着您需要以某种方式获取对此特定实例的引用

最简单的方法是使用
Application.Current.Windows
属性:

public static void ConnectToArduino()
{
    try
    {

        Arduino window = Application.Current.Windows.OfType<Arduino>().FirstOrDefault();
        string portName = window.tboxPortName.Text;
        sp.PortName = portName;
        sp.BaudRate = 9600;
        sp.Open();
        window.DisplayConnected();
        isConnected = true;
    }
    catch (Exception)
    {
        System.Windows.MessageBox.Show("Please give a valid port number or check your connection. " +
            "If the port number is correct but the error persist, please check if your Arduino device is correctly connected.");
    }
}

public static void DisconnectFromArduino()
{
    try
    {
        sp.Close();
        isConnected = false;
        Arduino window = Application.Current.Windows.OfType<Arduino>().FirstOrDefault();
        window.DisplayDisconnected();
    }
    catch (Exception)
    {
        System.Windows.MessageBox.Show("In order to disconnect, you have to connect first to an Arduino device.");
    }
}
publicstaticvoid ConnectToArduino()
{
尝试
{
Arduino window=Application.Current.Windows.OfType().FirstOrDefault();
字符串portName=window.tboxPortName.Text;
sp.PortName=PortName;
sp.BaudRate=9600;
sp.Open();
DisplayConnected();
断开连接=正确;
}
捕获(例外)
{
System.Windows.MessageBox.Show(“请提供有效的端口号或检查您的连接。”+
“如果端口号正确但错误仍然存在,请检查您的Arduino设备是否正确连接。”);
}
}
公共静态void disconnectfromaduino()
{
尝试
{
sp.Close();
断开连接=错误;
Arduino window=Application.Current.Windows.OfType().FirstOrDefault();
DisplayDisconnected();
}
捕获(例外)
{
System.Windows.MessageBox.Show(“要断开连接,必须先连接到Arduino设备。”);
}
}

您需要将标签作为参数传递到另一个classI。我意识到您的意思,我尝试了,但没有成功。我觉得这像WPF代码。如果它类似于WinForms,那么您的
ArduinoControl
类将创建一个
新的Arduino()表单,但从不显示它。我猜你是在试图引用屏幕上已经出现的表单。是的,它是wpf。我想新的Arduino()是问题的一部分。