【问题标题】:IronRuby and Handling XAML UI EventsIronRuby 和处理 XAML UI 事件
【发布时间】:2009-11-30 19:26:20
【问题描述】:

通过 IronRuby 脚本向 XAML 中的 UI 元素添加事件处理程序的最简洁的方法是什么?假设:添加事件处理程序的代码将写在 IronRuby 脚本中,处理事件的代码将在同一个 IronRuby 脚本中。

我想要以下代码的等价物,但在 IronRuby 中。处理一个简单的 button1 点击事件。

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        button1.Click += new RoutedEventHandler(button1_Click);
    }

    void button1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Hello World!");
    }
}

【问题讨论】:

    标签: .net wpf xaml ironruby dynamic-language-runtime


    【解决方案1】:

    据我所知,.NET 事件在 IronRuby 中作为获取块的方法公开。所以,你可以写:

    button1.click do |sender, args|
        MessageBox.show("Hello World!")
    end
    

    This 涵盖其他选项。

    【讨论】:

    • +1。这将满足我的大部分需求。我在您的链接中看到了 .remove 语法。这是否意味着它支持某种“.add”语法来添加多个处理程序,或者是多次调用相同的 click(&) 语法。
    • 删除示例使用此序列:button.click(&on_click); button.click.remove(on_click)
    • 我认为这意味着使用不同的参数(甚至相同的参数)多次调用click 将注册多个处理程序,与 C# 中相同。
    • 我在这个语法上遇到了一个错误(我认为) - 语法错误,意外的 IDENTIFIER
    • 我已经用它玩了一下,似乎 IRB 事件的语法仍然在变化,唯一万无一失的方法是始终使用块。如果您需要调用命名方法,请将调用包装在块内,即button1.click do |sender, args| foo(sender, args) end。如果您需要稍后取消注册处理程序,请从该块中创建一个 Proc 并将其存储在一个变量中,如 Shay 的回答中所述。
    【解决方案2】:

    如果对您更有意义,您也可以使用 add 订阅事件。

    p = Proc.new do |sender, args| 
      MessageBox.show("Hello  World!")
    end
    
    # Subscribe
    button1.click.add p
    
    # Unsubscribe
    button1.click.remove p
    

    【讨论】:

    • 请记住,您也可以从方法中获取那些“Proc”对象:“button1.click.add method(:foo)”,其中 :foo 是方法名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多