对于我C#基础不好的人在学WPF时的确碰到不少问题,最近做一个上位机串口的东西,看到很多教程上都是一个xaml文件对应一个CS文件,我希望不同文件归类管理,希望主线程CS文件中的方法函数中能调用其他CS文件中的类资源对象或者方法函数,有时一不小心就搞错。现在总结下来基本是这样的。
假如我有一个主线程xaml对应的CS文件MainWindows,默认类名是MainWindow
另外一个CS文件是S,其中声明了一个类名为SPort 如下
在MainWindows.cs文件中
public partial class MainWindow : Window
{
SPort serialCom; // 初始化对象
///SPort serialCom = new SPort(this);///编译报错
public MainWindow()//系统自动生成的构造函数
{
InitializeComponent();//系统自动生成的用于加载UI资源
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
serialCom = new SPort(this); //对象实例化
serialCom.Serial_Init();
}
private void COM_BUTTON1_Click(object sender, RoutedEventArgs e)
{
//SPort serialCom = new SPort(this);//局部创建无法全局应用
serialCom = new SPort(this);//对象实例化
//只有Sport 添加了相应的构造函数才能添加this
//this作为当前窗体的实例对象传到S文件的构造函数中
Thread thread0 = new Thread(ThreadWork0); //创建线程函数实例
thread0.Start();//开启线程
}
}
public void ThreadWork0() //线程函数
{
//SPort serialCom = new SPort(this);//运行报错//在线程中创建一个带方法形参的对象运行到这会报错
while (true)
{
Thread.Sleep(1000);
serialCom.SerialReceived();
}
}
在S.cs文件中
public class SPort
{
MainWindow mainWindow = new MainWindow(); //创建主窗口对象方法
public static SerialPort? serialPort; //串口类对象创建
public SPort(MainWindow mainWindow)
{
this.mainWindow = mainWindow; //构造函数带形参接收主文件中的窗体对象
} //这样可以操作MainWindow窗体下的UI资源
public SPort()
{
serialPort = new SerialPort();//在不带形参的构造函数中创建SerialPort方法
} //这个是串口方法
}
public void Serial_Init()
{
serialPort.Open();
this.mainWindow.ComListBox.IsEnabled = true;
//..........................
}
从上面可以看到,注释了几个报错的地方。在窗体中或者说脱离方法函数以外创建带形参的方法对象会报错,在线程函数中创建带形参方法的对象也会报错,所以这个局部带形参方法的对象创建目前我尝试下来只能在普通方法函数中操作。
MainWindows.cs文件中
SPort serialCom; // 初始化S文件中SPort类的一个对象
public MainWindow()//系统自动生成的构造函数
{
InitializeComponent();//系统自动生成的用于加载UI资源
}
serialCom = new SPort(this); //方法函数中使得对象实例化
再配合S.cs文件中
MainWindow mainWindow = new MainWindow(); //创建主窗口对象方法
public SPort(MainWindow mainWindow)
{
this.mainWindow = mainWindow; //构造函数带形参接收主文件中的窗体对象
} //这样可以操作MainWindow窗体下的UI资源
以上组合在一起使得在MainWindows.cs文件中MainWindows类中的方法函数中可以调用
S.cs文件中SPort类中方法函数对象和其他变量对象比如
serialCom = new SPort(this); //对象实例化
serialCom.Serial_Init(); //调用S.cs文件SPort类中的Serial_Init()
同时S.cs文件中也能操控MainWindow.cs文件中关联的XAMl 中的UI控件资源比如
this.mainWindow.ComListBox.IsEnabled = true; //ComListBox是MainWindow下拉框UI资源
另外说下S文件SPort类中的另一个构造函数
public static SerialPort? serialPort; //串口类对象创建初始化为空
public SPort()
{
serialPort = new SerialPort();
}
这个是调用的网上安装的IO包文件 SerialPort 是个类
using System.IO.Ports; //为串口新安装
然后再配合上面构造函数中的初始化创建串口方法的方式就可以调用串口安装文件中的资源比如
string[] coms = SerialPort.GetPortNames(); //获取串口名字
serialPort.Open();//开串口
关于串口的内容这里不在展开,以上是C#WPF中cs文件之间相互调用对方对象方法以及在构造函数方面的一些处理操作,自己感觉有点绕,没有C语言理解起来直观,先总结到这里。