所以我尝试创建一个新表单并引用它...编译器并不介意,但它显然没有改变我的图片框的可见性。这就是我调用我的表单中的方法,从我的c#脚本中调用。
Form1 updateForm = new Form1();
updateForm.setLights();
它调用了这个方法,看起来很有效!直到我读到关于实例化表格的帖子,以及如何创建一个" new" Form1 的实例,我的 updateForm 引用的任何内容都不会改变我在 Form1 上看到的内容。
所以我需要做的是在我的 Form1 中的 setLights()中调用该函数,然后让它更改我的图像的可见性表格,来自我的C#代码。请看下面(我理解上面提到的实例化问题的问题,但是我把它留在了这里,希望它能更好地洞察我是什么"尝试"做:)同时,请记住 setLightCall()正在一个单独的线程中运行。提前谢谢!
此代码也在我的主要c#脚本中,是我用来调用线程的主要功能
static void Main(string[] args)
{
Thread FormThread = new Thread(FormCall);
FormThread.Start();
Thread setLightThread = new Thread(setLightCall);
setLightThread.Start();
log4net.Config.XmlConfigurator.Configure();
StartModbusSerialRtuSlave();
}
此代码位于我的主要C#脚本
中public void setLightCall(Form1 parent)
{
Form1 updateForm = new Form1();
while(true)
{
updateForm.setLights();
}
}
以下代码位于我的form1
public void setLights()
{
Input1GreenLight.Visible = false;
}
答案 0 :(得分:2)
以下是我认为你想要尝试的一个例子。请注意,使用Invoking和delegates可以访问PictureBox的Visible方法。我必须将System.Windows.Forms命名空间添加到控制台应用程序,以便能够访问在FormThread方法中创建的Form的实例,这假设您在FormCollection中只有1个Form。
<强> Program.cs的强>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Windows.Forms;
namespace ConsoleApplication59
{
class Program
{
static void Main(string[] args)
{
Thread FormThread = new Thread(FormCall);
FormThread.Start();
Thread.Sleep(2000); //Sleep to allow form to be created
Thread setLightThread = new Thread(setLightCall);
setLightThread.Start(Application.OpenForms[0]); //We can get by with this because just one form
Console.ReadLine();
}
public static void setLightCall(object parent)
{
Form1 updateForm = (Form1)parent;
while (true)
{
updateForm.Invoke(updateForm.setLights, new object[] { false });
}
}
public static void FormCall()
{
Application.Run(new Form1());
}
}
}
<强> Form1中强>
public partial class Form1 : Form
{
public delegate void Lights(bool state);
public Lights setLights;
public Form1()
{
InitializeComponent();
setLights = new Lights(setLightsDelegate);
}
public void setLightsDelegate(bool state)
{
Input1GreenLight.Visible = state;
}
}