在DispatcherTimer EventHandler中添加其他字符串参数

时间:2015-01-25 15:27:19

标签: c# wpf dispatchertimer

如何在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)
{
    [...]
}

我如何实现这一目标?

编辑:

我的目的是为移动物体添加一些动画。我的画布上有很少的物体。我可以通过鼠标点击在画布上移动这些对象,我想为这个动作添加动画。

2 个答案:

答案 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;

显然,如果你只有一个同一个计时器的事件处理程序,你也可以将所需的数据存储在任何使用它的类中。