Доступ к элементам управления форм из класса C # Windows форм - PullRequest
0 голосов
/ 01 ноября 2010

привет В основной форме у меня есть элемент управления таймером, который создает экземпляр класса, при определенных условиях метод класса должен останавливать таймер.

есть ли способ установить для свойства Enabled таймеров значение false, не передав элемент управления методу?

Могу ли я как-нибудь проверить все элементы управления в основной форме для таймера, а затем отключить его?

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

Я бы хотел, чтобы у класса был конструктор, который либо принимает интерфейс

interface IStopTimer
{
    void StopTimer();
}

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

или делегат

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

Или, возможно, метод таймера для достижения того же самого. Таким образом, класс не зависит от Windows Forms и не знает, что вы используете для таймера.

0 голосов
/ 01 ноября 2010

Вы можете создать событие из класса, которое останавливает таймер и вызывает его всякий раз, когда вы хотите, чтобы это произошло. Из внешнего класса (основной формы) после того, как вы установите класс, вы подписываетесь на это событие и останавливаете таймер в обработчике.

Вот как вы поднимаете событие:

    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;
    }
}
0 голосов
/ 01 ноября 2010

Так или иначе, метод будет нуждаться в ссылке (прямо или косвенно) на таймер, чтобы остановить его.Вы можете наложить на него абстракции, но это не будет красиво.

Не могли бы вы использовать что-то вроде ThreadPool.QueueUserWorkItem() вместо таймера для запуска операции, которую выполняет таймер?Таким образом, когда операция будет завершена, поток вернется в пул, и у вас будет механизм «запусти и забудь».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...