2012-12-28 90 views
3

我试图创建一个方法,它需要委托作为其参数之一,但它不工作。我究竟做错了什么?我得到错误“回调是一个变量,但像一种方法使用”在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

让我建议一个更优雅的语法(imo):Dispatcher.BeginInvoke((Action)(()=> {});' – abatishchev

+0

谢谢。有什么不同?它只是一个捷径, – Aaron

+0

据我所知,没有什么区别,只是一个味道的问题,正如我从开始强调:) – abatishchev

回答

2

我只是想我会解释一下为什么Delegate本身不窝RK。

Delegate不是真正的代表,而是一个代表。它基本上是一个拥有委托的变量。这就是为什么给一个变量像方法一样给出错误的原因。

一个简单的例子(授予你可能永远不会这样做)是如果你有两个代表做添加。一个用ints,另一个用浮动。您可以存储代表在Delegate对象,并传递给一个变量调用DynamicInvoke()另一个功能:

void MyMethod(Delegate d) 
    { 
     d.DynamicInvoke(leftHandSide, rightHandSide); 
    } 

没有这两个代表存储在Delegate对象的事,你会得到相应的功能。

在你的情况下,windowAnimation.Completed正在期待一个实际的委托方法,如EventHandler。另外,EventHandler的构造函数需要一个委托方法。因此在任何情况下使用Delegate对象都不起作用。

你必须包装在一个委托或使用lambda功能将真正的方法调用

windowAnimation.Completed += (s,e) => callback.DynamicInvoke(); 

或更改callbackEventHandler,并创建一个新的时,当你想调用这种方法。

+0

谢谢!这涵盖了我想知道的一切,现在我明白了为什么我的方法不起作用的原因。 – Aaron

0

你可以在你的方法签名更改为:

private void animateWindowWidth(
    Window window, 
    double width, 
    double duration, 
    EventHandler callback) 

,并导致错误到

windowAnimation.Completed += callback; 

该行然后创建一个新EvenHandler,当你调用该方法。

+0

谢谢,这是有效的。以我的方式做到这一点是不可能的? – Aaron

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(); 
} 
+0

谢谢,但那不适合我。我得到“只有赋值,调用,递增,递减,等待和新的对象表达式可以用作语句”作为错误。 – Aaron

+0

谢尔盖五,你编译它?至少你应该写'windowAnimation.Completed + =(s,e)=> callback.DynamicInvoke(s,e);'。但为什么会这样做添加一个简单的事件处理程序? – horgh

+0

对不起,我没有编译它)。为了使它工作,只需用Action替换Delegate。 –