在 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 正在使用它的地方。
如何将额外的字符串参数添加到 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 正在使用它的地方。