将变量传递给 timer_tick
Passing a variable to timer_tick
目前遇到问题,我正在使用计时器制作动画,我希望能够决定从哪里开始使用开始和停止整数,如下所示。
private void Button1_Click(object sender, EventArgs e)
{
AnimateKey(0,100);
}
private void AnimateKey(int Start, int Stop)
{
myTimer.Interval = 5;
myTimer.Tick += new EventHandler(myTimer_Tick);
myTimer.Enabled = true;
myTimer.Start();
}
private void myTimer_Tick(object sender, EventArgs e)
{
lock (myTimer)
{
int StartingFrame = Start;
int StopFrame = Stop;
etc...etc..
}
}
现在我的问题是我想将值 0 和 100 传递给 Timer Tick 事件,但我不知道如何去做。
如何从按钮点击到计时器刻度中获取整数 0 和 100?
对所有信息使用 class:
public class TimerInfo
{
public int Start;
public int Stop;
}
在计时器的标签中存储一个实例
myTimer.Tag = new TimerInfo { Start = 0, Stop = 100 };
在事件处理程序中您可以访问此信息
myTimer = (Timer)sender;
TimerInfo ti = (TimerInfo)myTimer.Tag;
有点难以理解你的意思,但让我们试一试。
如果您提到要将整数开始和停止传递给函数 TimerTick,您可能不了解 EventArgs 参数。 EventArgs 用于存储与您的场景相关的参数 - 解决方案很简单。
class myTimerEventArgs:EventArgs // Declaring your own event arguements which you want to send
{
public int start{get;set;}
public int stop {get;set;}
/*Constructor, etc...*/
}
...
//Making the call inside another class:
myTimer_Tick(this,new myTimerEventArgs(0,100);
但是,我可能误会了你;如果正在谈论计数滴答直到达到 100 个滴答(/间隔),解决方案是添加到事件中的一个简单函数,它可能看起来像这样:
int Count = 0;
...
private void Counter(object sender, EventArgs e)
{
Count++;
}
...
private void AnimateKey(int Start, int Stop)
{
myTimer.Interval = 5;
myTimer.Tick += new EventHandler(myTimer_Tick);
myTimer.Tick += new EventHandler(Counter);
myTimer.Enabled = true;
myTimer.Start();
while(Count!=100);
myTimer.Stop();
}
希望我有所帮助,祝你有愉快的一天:)
只需在定义 tick 事件处理程序时使用 lambda 来关闭您需要的参数:
private void AnimateKey(int Start, int Stop)
{
myTimer.Interval = 5;
myTimer.Tick += (s, args) => myTimer_Tick(Start, Stop);
myTimer.Enabled = true;
myTimer.Start();
}
private void myTimer_Tick(int Start, int Stop)
{
//Do stuff
}
另请注意,您正在使用的 Timer
的 Tick
事件将在 UI 线程中触发,因此不需要 lock
;代码已经同步。
目前遇到问题,我正在使用计时器制作动画,我希望能够决定从哪里开始使用开始和停止整数,如下所示。
private void Button1_Click(object sender, EventArgs e)
{
AnimateKey(0,100);
}
private void AnimateKey(int Start, int Stop)
{
myTimer.Interval = 5;
myTimer.Tick += new EventHandler(myTimer_Tick);
myTimer.Enabled = true;
myTimer.Start();
}
private void myTimer_Tick(object sender, EventArgs e)
{
lock (myTimer)
{
int StartingFrame = Start;
int StopFrame = Stop;
etc...etc..
}
}
现在我的问题是我想将值 0 和 100 传递给 Timer Tick 事件,但我不知道如何去做。 如何从按钮点击到计时器刻度中获取整数 0 和 100?
对所有信息使用 class:
public class TimerInfo
{
public int Start;
public int Stop;
}
在计时器的标签中存储一个实例
myTimer.Tag = new TimerInfo { Start = 0, Stop = 100 };
在事件处理程序中您可以访问此信息
myTimer = (Timer)sender;
TimerInfo ti = (TimerInfo)myTimer.Tag;
有点难以理解你的意思,但让我们试一试。 如果您提到要将整数开始和停止传递给函数 TimerTick,您可能不了解 EventArgs 参数。 EventArgs 用于存储与您的场景相关的参数 - 解决方案很简单。
class myTimerEventArgs:EventArgs // Declaring your own event arguements which you want to send
{
public int start{get;set;}
public int stop {get;set;}
/*Constructor, etc...*/
}
...
//Making the call inside another class:
myTimer_Tick(this,new myTimerEventArgs(0,100);
但是,我可能误会了你;如果正在谈论计数滴答直到达到 100 个滴答(/间隔),解决方案是添加到事件中的一个简单函数,它可能看起来像这样:
int Count = 0;
...
private void Counter(object sender, EventArgs e)
{
Count++;
}
...
private void AnimateKey(int Start, int Stop)
{
myTimer.Interval = 5;
myTimer.Tick += new EventHandler(myTimer_Tick);
myTimer.Tick += new EventHandler(Counter);
myTimer.Enabled = true;
myTimer.Start();
while(Count!=100);
myTimer.Stop();
}
希望我有所帮助,祝你有愉快的一天:)
只需在定义 tick 事件处理程序时使用 lambda 来关闭您需要的参数:
private void AnimateKey(int Start, int Stop)
{
myTimer.Interval = 5;
myTimer.Tick += (s, args) => myTimer_Tick(Start, Stop);
myTimer.Enabled = true;
myTimer.Start();
}
private void myTimer_Tick(int Start, int Stop)
{
//Do stuff
}
另请注意,您正在使用的 Timer
的 Tick
事件将在 UI 线程中触发,因此不需要 lock
;代码已经同步。