【问题标题】: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 中编写此代码?

【问题讨论】:

    标签: c# xaml blend


    【解决方案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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多