【问题标题】:How to access a timer from another class in C#如何从 C# 中的另一个类访问计时器
【发布时间】:2011-09-28 00:34:51
【问题描述】:

另请参阅:How to enable a timer from a different thread/class

计时器已分配给一个表单,我想在特定位置启用它,但来自另一个类。我不想公开它

这是我用来访问备忘录的代码

    public string TextValue
    {
        set
        {
            if (this.Memo.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    this.Memo.Text += value + "\n";
                });
            }
            else
            {
                this.Memo.Text += value + "\n";
            }
        }
    }

    public static void addtxt(string txt)
    {
        var form = Form.ActiveForm as Form1;
        if(form != null)
            form.TextValue = txt;
    }

【问题讨论】:

    标签: c# winforms timer


    【解决方案1】:

    如果您不想公开计时器本身,请公开一个您可以调用以启用计时器的public 方法或属性。显然,启用 Timer 的 Form 需要引用拥有 TimerForm

    【讨论】:

    • 这仍然意味着其他类需要引用包含计时器的表单。
    • 然后呢?那不是问题。问题是希望在不暴露计时器本身的情况下启用计时器。
    【解决方案2】:

    您希望如何启用计时器?采取了哪些措施来启用它?

    是否可以向要启用计时器的类添加事件,并在包含计时器的表单上订阅该事件? 在该事件的事件处理程序中,您可以启用计时器。

    当其他类引发事件时,事件处理程序将启用计时器。

    public class SomeOtherClassThatDoesStuff
    {
       public event EventHandler SomethingHappened;
    
       public void DoStuff()
       {
          ...
          if( SomethingHappened != null )
             SomethingHappened;
          ...
       }
    }
    
    public class Form1
    {
    
        private void Button1_Click(object sender, EventArgs e )
        {
    
          SomeOtherClassThatDoesStuff o = new SomeOtherClassThatDoesStuff();
          o.SomethingHappened += new EventHandler(EnableTimer);
    
          o.DoStuff();
        }
    
        private void EnableTimer(object sender, EventArgs e )
        {
           myTimer.Enabled = true;
        }
    }
    

    类似的东西。 (我没有测试过,也没有编译过,但我想你会明白的:))。

    【讨论】:

    • “发生了什么事;”错了。对不起,我从来没有手写过事件。该行必须有两个参数(对象发送者和EventArgs e)。我应该传递什么参数?
    • 问题 2,DoStuff() 不仅是公开的,而且在我的代码中是静态的。如果方法是静态的,我无法访问SomethingHappened。
    • 如前所述,我没有编译 :) 您可以在引发事件时简单地传递这个和 EventArgs.Empty。也许您也可以将事件设为静态(不知道是否可行),但我应该检查是否有必要将“DoStuff”设为静态。
    【解决方案3】:

    将计时器设置为“内部”,然后程序集中的其他类可以访问它。

    【讨论】:

    • 是的,它可以被其他类访问,但是如果其他类将 Enable 属性更改为 true,则计时器仍然不会 Tick()。
    【解决方案4】:

    您可以添加一个访问器方法来启用计时器,这将允许您将计时器保持为私有但将方法公开,这样可以吗?

    此外,您可以考虑将访问器设置为 protectedinternal,这取决于调用它的人,它可能不需要公开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多