我正在尝试创建一个方法,将委托作为其参数之一但不起作用。我究竟做错了什么?我在windowAnimation.Completed += new EventHandler(callback)
的行上收到错误“回调是一个变量但是像方法一样使用”。
private void animateWindowWidth(Window window, double width, double duration, Delegate callback)
{
window.BeginInit();
window.Dispatcher.BeginInvoke(new Action(() =>
{
DoubleAnimation windowAnimation = new DoubleAnimation();
windowAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration));
windowAnimation.From = window.Width;
windowAnimation.To = width;
windowAnimation.FillBehavior = FillBehavior.HoldEnd;
windowAnimation.Completed += new EventHandler(callback);
window.BeginAnimation(Window.WidthProperty, windowAnimation);
}), null);
window.EndInit();
}
答案 0 :(得分:2)
我只是想我会解释为什么Delegate
本身不起作用。
Delegate
不是真正的委托,而是一个代表。它基本上是一个拥有委托的变量。这就是为什么像处理方法一样处理变量的错误。
一个简单的例子(授予你可能永远不会这样做)是你有两个代表来做加法。一个有整数,另一个有浮点数。您可以将代理存储在Delegate
对象中,并将其传递给另一个在一个变量上调用DynamicInvoke()
的函数:
void MyMethod(Delegate d)
{
d.DynamicInvoke(leftHandSide, rightHandSide);
}
无论两个代表中的哪一个存储在Delegate
对象中,您都可以获得相应的功能。
在您的情况下,windowAnimation.Completed
期待一个实际的委托方法,例如EventHandler。另外,EventHandler的构造函数需要一个委托方法。因此,在任何一种情况下使用Delegate
对象都不起作用。
您必须将其包装在委托中或使用lambda函数来放置真正的方法调用
windowAnimation.Completed += (s,e) => callback.DynamicInvoke();
或将callback
更改为EventHandler
,并在您想要调用此方法时创建一个新的。
答案 1 :(得分:0)
您可以将方法签名更改为:
private void animateWindowWidth(
Window window,
double width,
double duration,
EventHandler callback)
以及导致错误
的那一行windowAnimation.Completed += callback;
然后在调用方法时创建一个新的EvenHandler
。
答案 2 :(得分:0)
尝试使用Action
代替Delegate
并替换此字符串:
windowAnimation.Completed += new EventHandler(callback);
用这个:
windowAnimation.Completed += (s, e) => callback();
所以,最后看起来应该是这样的:
private void animateWindowWidth(Window window, double width, double duration, Action callback)
{
window.BeginInit();
window.Dispatcher.BeginInvoke(new Action(() =>
{
DoubleAnimation windowAnimation = new DoubleAnimation();
windowAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration));
windowAnimation.From = window.Width;
windowAnimation.To = width;
windowAnimation.FillBehavior = FillBehavior.HoldEnd;
windowAnimation.Completed += (s, e) => callback());
window.BeginAnimation(Window.WidthProperty, windowAnimation);
}), null);
window.EndInit();
}