IronRuby и обработка событий пользовательского интерфейса XAML

Каков наиболее краткий и лаконичный способ добавления обработчиков событий к элементам пользовательского интерфейса в XAML с помощью сценария IronRuby? Предположение: код для добавления обработчика событий будет написан в скрипте 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!");
    }
}

person BuddyJoe    schedule 30.11.2009    source источник


Ответы (2)


Насколько мне известно, события .NET представлены в IronRuby как методы, принимающие блоки. Итак, вы можете написать:

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

Здесь описаны другие варианты.

person Pavel Minaev    schedule 30.11.2009
comment
+1. Это удовлетворит большинство моих потребностей. Я вижу синтаксис .remove в вашей ссылке. Означает ли это, что он поддерживает какой-то синтаксис .add для добавления нескольких обработчиков, или это будет тот же синтаксис щелчка (&), вызываемый несколько раз. - person BuddyJoe; 30.11.2009
comment
В примере удаления используется такая последовательность: button.click(&on_click); button.click.remove(on_click) - person Pavel Minaev; 30.11.2009
comment
Я предполагаю, что это означает, что вызов click несколько раз с разными аргументами (или даже с одним и тем же аргументом) зарегистрирует несколько обработчиков, как в C #. - person Pavel Minaev; 30.11.2009
comment
Я получаю сообщение об ошибке в этом синтаксисе (я думаю) - синтаксическая ошибка, неожиданный ИДЕНТИФИКАТОР - person BuddyJoe; 01.12.2009
comment
На каком - с do или с именованной функцией? - person Pavel Minaev; 01.12.2009
comment
Я немного поиграл с этим, и кажется, что синтаксис для событий IRB все еще находится в постоянном движении, и единственный надежный способ - всегда использовать блоки. Если вам нужно вызвать именованный метод, оберните вызов внутри блока, то есть button1.click do |sender, args| foo(sender, args) end. Если вам нужно отменить регистрацию обработчика позже, сделайте Proc из этого блока и сохраните его в переменной, как в ответе Шэя. - person Pavel Minaev; 01.12.2009
comment
button.click {|sender, args| MessageBox.show( args.to_s )} тоже работает - person Joshua Drake; 20.03.2013

Вы также можете использовать add, чтобы подписаться на событие, если оно имеет для вас больше смысла.

p = Proc.new do |sender, args| 
  MessageBox.show("Hello  World!")
end

# Subscribe
button1.click.add p

# Unsubscribe
button1.click.remove p
person Shay Friedman    schedule 01.12.2009
comment
Имейте в виду, что вы также можете получить эти объекты Proc из метода: button1.click.add method (: foo), где: foo - это имя метода. - person Jimmy Schementi; 29.12.2009