c# - 将委托(delegate)作为参数的方法?

标签 c# .net wpf animation delegates

我正在尝试创建一个将委托(delegate)作为其参数之一的方法,但它不起作用。我究竟做错了什么?我在具有 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();
}

最佳答案

我只是想解释一下为什么 Delegate 本身不起作用。

Delegate 不是真正的委托(delegate),而是一个委托(delegate)。它基本上是一个持有委托(delegate)的变量。这就是为什么像对待方法一样对待变量会报错的原因。

一个简单的例子(当然你可能永远不会这样做)是如果你有两个委托(delegate)做加法。一个用整数,另一个用 float 。您可以将委托(delegate)存储在 Delegate 对象中,并将其传递给另一个调用一个变量的 DynamicInvoke() 的函数:

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

无论两个委托(delegate)中的哪一个存储在 Delegate 对象中,您都可以获得相应的功能。

在您的情况下,windowAnimation.Completed 需要一个实际的委托(delegate)方法,例如 EventHandler。此外,EventHandler 的构造函数需要一个委托(delegate)方法。因此,在任何一种情况下都无法使用 Delegate 对象。

您必须将其包装在委托(delegate)中或使用 lambda 函数来放置真正的方法调用

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

或者将 callback 更改为 EventHandler 并在您想要调用此方法时创建一个新的。

关于c# - 将委托(delegate)作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14064486/

相关文章:

c# - "Authentication failed because the remote party has closed the transport stream"使用 FluentFTP 通过 TLS/SSL 传输到/从 FTP 服务器时

wpf - 单击按钮后检查 IDataErrorInfo 中是否有错误

c# - 使用 WebView 全屏制作 XAML 控件

c# - WPF GridView 中的可编辑组合框

c# - 音频的捕获和播放 (WP8.1 XAML)

c# - 一个excel图表中的两个轴

c# - 数据表左加入 c#

c# - 以编程方式获取 Windows RunAsUser 提示

c# - 正确关闭 C# excel COM 对象

c# - DataGrid 失去选择