如何在Dispatchertimer Eventhandler中添加额外的字符串参数?。
我想实现这样的目标:
string ObjectName = "SomeObjectName";
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick(ObjectName));
功能:
private void dispatcherTimer_Tick(object sender, EventArgs e, string ObjectName)
{
[...]
}
我如何实现这一目标?
编辑:
我的目的是为移动物体添加一些动画。我的画布上有很少的物体。我可以通过鼠标点击在画布上移动这些对象,我想为这个动作添加动画。
答案 0 :(得分:7)
您可以使用闭包:
...
{
string objectName = "SomeObjectName";
var dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += (sender, e) => { myTick(sender, e, objectName); };
}
private void myTick(object sender, EventArgs e, string objectName)
{
[...]
}
但请注意,变量 objectName
被捕获,而不是它的当前值。这意味着如果你这样做:
...
{
string objectName = "SomeObjectName";
var dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += (sender, e) => { myTick(sender, e, objectName); };
objectName = "SomeOtherObjectName";
}
将使用SomeOtherObjectName
调用myTick,乍一看可能违反直觉。这样做的原因是,在幕后创建了一个带有objectName
字段的单独对象实例 - 与Chris' solution明确表达的内容非常相似。
答案 1 :(得分:1)
您可以使用此技巧传递与您一样多的数据:
class Foo
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
// ...
public void OnTick( object sender, EventArgs e )
{
// logic here
}
}
var f = new Foo() { PropertyA = "some stuff here",
PropertyB = "some more stuff here" };
dispatcherTimer.Tick += f.OnTick;
显然,如果你只有一个同一个计时器的事件处理程序,你也可以将所需的数据存储在任何使用它的类中。