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

3 回答 3

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

于 2012-12-28T06:01:36.223 回答
0

您可以将方法签名更改为:

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

以及导致错误的那一行

windowAnimation.Completed += callback;

EvenHandler然后在调用该方法时创建一个新的。

于 2012-12-28T04:26:00.093 回答
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();
}
于 2012-12-28T04:48:40.077 回答