在 DispatcherTimer EventHandler 中添加额外的字符串参数

Add additional string parameter into DispatcherTimer EventHandler

如何将额外的字符串参数添加到 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)
{
    [...]
}

我怎样才能做到这一点?

编辑:

我的意图是为移动对象添加一些动画。我有 canvas,其中的对象很少。我可以通过单击鼠标在 canvas 上移动这个对象,我想为这个移动添加动画。

您可以为此使用 闭包

... 
{    
    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";
}

myTick 将通过 SomeOtherObjectName 调用,乍一看可能有悖常理。这样做的原因是,在幕后,创建了一个带有 objectName 字段的单独对象实例——与 正在明确执行的操作非常相似。

您可以使用此技巧传递任意多的数据:

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;

显然,如果您对同一个计时器只有一个事件处理程序,那么您也可以将所需的数据存储在任何 class 正在使用它的地方。