如何使用带参数的函数作为事件处理程序?

Posted

技术标签:

【中文标题】如何使用带参数的函数作为事件处理程序?【英文标题】:How to use functions with parameters as event handlers? 【发布时间】:2013-06-04 18:44:13 【问题描述】:

我正在使用 Blend(我对它非常陌生)来创建 XAML。我有一行代码调用下面的函数writeC

<Button x:Name="key_c" Content="c" HorizontalAlignment="Left" Height="60" 
    Margin="243,188.667,0,0" VerticalAlignment="Top" Width="60" FontWeight="Bold"
    FontFamily="Century Gothic" FontSize="21.333" Foreground="Black" 
    Click="writeC">

这很好用。但是,我想将其更改为调用带有参数"a""A" 的函数WriteChar,以便它调用以下C# 函数:

private void writeChar(string myCharCaps, string myCharLower)

如何在 XAML 中编写此代码?

【问题讨论】:

【参考方案1】:

您的点击处理程序需要遵守事件处理程序签名。如果您想让该处理程序成为您的 WriteChar 的简单包装器,那很好。更多信息在这里:http://msdn.microsoft.com/en-us/library/bb531289(v=vs.90).aspx

【讨论】:

好吧,我还是不太明白。我阅读了说明,但我仍然有点迷茫。抱歉...我对 XAML 和 C# 很陌生。 不确定如何帮助您。如果您对编写函数本身感到困惑,您可以在 XAML 中执行此操作,但在代码隐藏文件(如 C# 或 VB.NET)中实现逻辑要容易得多。 获得正确签名的最简单方法是在 xaml 编辑器中,键入“Click=",它应该会像“新事件处理程序”一样弹出自动完成,然后按 Enter。它会给它一个名字,并在代码文件中创建具有正确签名的方法。 嗯...这个过程似乎不会自动完成。我必须安装某些东西或启用某些东西吗?【参考方案2】:

您可以使用命令和命令参数来代替事件处理程序:

视图模型:

public ICommand MyCommand  get; private set; 

// ViewModel constructor
public ViewModel()

    // Instead of object, you can choose the parameter type you want to pass.
    MyCommand = new DelegateCommand<object>(MyCommandHandler);


public void MyCommandHandler(object parameter)

    // Do stuff with parameter

XAML:

<Button Command="Binding MyCommand" CommandParameter="..." />

您可以在 WPF here 中阅读有关命令的更多信息。

当然,如果您希望按钮始终执行具有相同参数的代码,那么从按钮传递参数没有任何意义,这些参数可以硬编码到处理程序中:

<Button Click="Button_Click" />

private void Button_Click(object sender, EventArgs e)

    WriteChar("a", "A");

【讨论】:

以上是关于如何使用带参数的函数作为事件处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery:如何在事件处理函数中获取事件对象而不将其作为参数传递?

如何将函数作为参数传递,带参数? [复制]

拼接的html字符串中如何将对象作为参数传递给事件处理函数

如何集成 API Gateway 调用带参数的 Lambda 函数?

JQuery的on()监听方法使用

js如何清除所有绑定的事件?