[C#将回调传递给按钮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C#将回调传递给按钮相关的知识,希望对你有一定的参考价值。

在Java或Flash中,我习惯于将回调传递给我的按钮对象,如下所示:

主要类别

function init() {
   var myButton = new Button("red", doSomething);
}
function doSomething() {
    log("someone clicked our button, but who?");
}

按钮类构造器

function Button(color, callback) {
     addListener(mouseClick, callback);
}

此示例已大大简化,关键是您可以将函数名称作为参数传递给Button实例。单击该按钮后,它将调用该函数。

在C#中可能吗?我已经阅读了一些有关委托的内容,但无法找出一个简单的示例。

答案

非常简单:

//Declare the function "interface"
delegate string UppercaseDelegate(string input);
//Declare the function to be passed
static string UppercaseAll(string input)
{
return input.ToUpper();
}
//Declare the methode the accepts the delegate
static void WriteOutput(string input, UppercaseDelegate del)
{
    Console.WriteLine("Before: {0}", input);
    Console.WriteLine("After: {0}", del(input));
}

static void Main()
{
WriteOutput("test sentence", new UppercaseDelegate(UppercaseAll));
}
另一答案

使用按钮之类的UI控件的通常方法是将事件附加到它们。 .NET中的事件处理程序具有2个参数(object senderEventArgs e)的标准化(但不是强制性)格式。声明因您使用的UI框架而异。这是一个ASP.NET声明。

<asp:Button ID="btnDoSomething" runat="server" Text="Do Something"  OnClick="btnDoSomething_Click" />

然后,文件后面的代码将具有相应的事件处理程序功能来执行代码。

protected void btnDoSomething_Click(object sender, EventArgs e)
{
    // Do something
}

传递函数

在C#中也可以传递函数。

最简单的语法(至少我认为是这样)是使用Func<T>Func<T>类型。 Action<T>映射到函数,Action<T>映射到不返回结果的命令。

因此,您的示例的模拟将是这样。

Func<T>

这些类型中的每一个都有许多重载,您还可以定义输入参数类型,对于Action<T>,还可以定义输出返回类型。

另一答案

似乎没有一种使用WinForms中的Button类在构造函数中分配回调的方法。但第二步很容易做到:

public class Button
{
    private readonly string color;
    private readonly Action callback;

    public Button(string color, Action callback)
    {
        this.color = color;
        this.callback = callback;
    }

    public void Click()
    {
        // This executes the callback action
        this.callback();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var myButton = new Button("red", DoSomething);
        myButton.Click(); // Prints "Something was done" to the console.
    }

    private void DoSomething()
    {
        Console.WriteLine("Something was done");
    }
}

以上是关于[C#将回调传递给按钮的主要内容,如果未能解决你的问题,请参考以下文章

将 Go 函数作为回调传递给 C

FLTK:按下哪个按钮 - 将数字传递给按钮的回调(lambda)

如何将 C++ 回调传递给 C 库函数?

Twisted-将结果传递给多个回调

如何从活动中传递回调到片段

将带有参数的 c# 回调方法传递给 c++ dll 会导致 System.ExecutionEngineException