Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个调度程序计时器,移动多个元素C#wpf_C#_Wpf_Timer_Dispatchertimer - Fatal编程技术网

一个调度程序计时器,移动多个元素C#wpf

一个调度程序计时器,移动多个元素C#wpf,c#,wpf,timer,dispatchertimer,C#,Wpf,Timer,Dispatchertimer,我正在尝试对多个元素(可视、移动stackpanel)使用Dispatcher 是否可以为多个元素调用相同的Dispatchermer\u Tick?它们同时移动,但使用循环?还有,我应该如何延迟调度计时器,以便在一段时间后创建新的部队 目前我还没有这样的东西 for (int i = 1; i < 3; i++) { dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Tick += new EventHand

我正在尝试对多个元素(可视、移动stackpanel)使用
Dispatcher

是否可以为多个元素调用相同的
Dispatchermer\u Tick
?它们同时移动,但使用循环?还有,我应该如何延迟调度计时器,以便在一段时间后创建新的部队

目前我还没有这样的东西

for (int i = 1; i < 3; i++)
{
    dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);
    index = i;
    FirstTroop(i);
    dispatcherTimer.Start();
}     
for(int i=1;i<3;i++)
{
Dispatchermer=新Dispatchermer();
dispatchermer.Tick+=新事件处理程序(dispatchermer\u Tick);
Dispatchermer.Interval=新的时间跨度(0,0,0,0,1);
指数=i;
第一部队(一);
dispatchermer.Start();
}     
是否可以为多个元素调用同一个Dispatchermer_Tick

是的,您可以在代码中的任何地方调用
dispatchermer\u Tick(null,null)
。但建议将事件处理程序仅用于处理tick事件,并为此调用更有意义的方法。像一支
队伍

dispatcherTimer_Tick(object sender, EventArgs e)
{
    SpawnFirstTroop();
}
它们同时移动,但使用循环

因此,您需要在循环中调用
dispatchermer\u Tick

void Start()
{
    dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = TimeSpan.FromMilliseconds(1000);
    dispatcherTimer.Start();
}

dispatcherTimer_Tick(object sender, EventArgs e)
{
    for (int i = 1; i < 3; i++)
    {
        SpawnTroop(i);
    }  
}
void Start()
{
Dispatchermer=新Dispatchermer();
dispatchermer.Tick+=新事件处理程序(dispatchermer\u Tick);
Dispatchermer.Interval=TimeSpan.From毫秒(1000);
dispatchermer.Start();
}
Dispatchermer_Tick(对象发送方,事件参数e)
{
对于(int i=1;i<3;i++)
{
部队(一);
}  
}
还有,我应该如何延迟调度计时器,以便在一段时间后创建新的部队

根据MSDN:

如果在WPF应用程序中使用System.Timers.Timer,则值得注意的是System.Timers.Timer运行在与用户界面(UI)线程不同的线程上。为了访问用户界面(UI)线程上的对象,需要使用Invoke或BeginInvoke将操作发布到用户界面(UI)线程的调度程序上。使用Dispatcher而不是System.Timers.Timer的原因是,Dispatcher与Dispatcher运行在同一线程上,并且可以在Dispatcher上设置DispatcherPriority

有多种解决方案:

  • 您不能使用
    线程。将
    Dispatcher\u Tick
    与Sleep
    配合使用。但您可以使用
    Thread.Sleep
    计时器来延迟计时器的滴答事件处理程序

  • 您可以为Dispatchermer编写更多代码,以启用两个间隔(如使用事件处理程序的简单整数计数器)。不建议采用这种方法

  • 您可以使用两个调度程序计时器,一个用于排队/请求新对象,一个用于创建/显示它们


  • 非常感谢您,先生,我自己做了一些类似的事情,但无论如何,谢谢您的时间:)我将再次尝试阅读MSDN文档。