从C#代码更改图片框可见性

时间:2014-08-19 23:51:44

标签: c# multithreading forms picturebox

所以我尝试创建一个新表单并引用它...编译器并不介意,但它显然没有改变我的图片框的可见性。这就是我调用我的表单中的方法,从我的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;
    }

1 个答案:

答案 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;
    }

}