繁体   English   中英

从类C#Windows窗体访问窗体控件

[英]Accessing a forms controls from a class c# windows forms

嗨,我在主窗体上有一个计时器控件,该控件创建一个类的实例,在某些情况下,该类的方法需要停止计时器。

有没有一种方法可以将计时器Enabled属性设置为false,而无需将控件传递给方法?

我可以如何检查计时器主窗体上的所有控件,然后将其禁用?

我要让该类具有一个采用接口的构造函数

interface IStopTimer
{
    void StopTimer();
}

class MyClass
{
    public MyClass(IStopTimer stopTimer)
    ...

或代表

class MyClass
{
    public MyClass(Action stopTimer)
    ...

或者可能是计时器方法来实现相同的目的。 这样,该类就不依赖于Windows Forms,也不知道您要使用的计时器是什么。

该方法将以一种或另一种方式(直接或间接)引用计时器以使其停止。 您可以在其上分层抽象,但效果并不理想。

您可以使用ThreadPool.QueueUserWorkItem()类的东西代替计时器来启动计时器执行的操作吗? 这样,当操作完成时,线程将返回到池中,并且您具有“即发即弃”机制。

您可以从该类中创建一个事件,该事件将停止计时器,并在您希望发生该事件的任何时间引发它。 在使该类实例化之后,从外部类(主窗体)开始,您订阅该事件并在处理程序中停止计时器。

这是引发事件的方式:

    class Class1
{
    public event EventHandler StopTimer;

    public void SomeMethod()
    {
        if (StopTimer != null)
            StopTimer(this, EventArgs.Empty);
    }

}

这是您的主要形式:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Class1 myClass = new Class1();
        myClass.StopTimer += new EventHandler(myClass_StopTimer);

        timer1.Enabled = true;
        timer1.Start();
    }

    void myClass_StopTimer(object sender, EventArgs e)
    {
        timer1.Stop();
        timer1.Enabled = false;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM