C#传递回调到按钮

时间:2015-03-15 19:06:54

标签: c# xna

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

MAIN CLASS

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#中是否可行?我已经阅读了有关代表的内容,但无法找出一个简单的例子。

3 个答案:

答案 0 :(得分:1)

使用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>Action<T>类型。 Func<T>映射到函数,Action<T>映射到不返回结果的命令。

所以,你的例子的模拟就是这样的。

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");
    }
}

这些类型中的每一个都有许多重载,允许您也定义输入参数类型,并且在Func<T>的情况下输出返回类型。

答案 1 :(得分:0)

这很简单:

//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));
}

答案 2 :(得分:-1)

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

Button myButton = new Button("Text Displayed");
myButton.Click += (sender, args) => SomeFunction();