2014-05-02 4 views
3

Понимание (по общему признанию шатки) заключается в том, что вы должны иметь возможность добавлять любое количество делегатов в событие C#, и все они вызываются (в некотором неопределенном порядке). Но это не похоже на мой проект. У меня это сводилось к двум делегатам, добавляемых в активированном случае NSButton (это в MonoMac), например, так:Вызывается только один обработчик события C#

nsButton = new NSButton(new System.Drawing.RectangleF(0, 0, 100, 100)); 
nsButton.StringValue = "Click me!"; 

nsButton.Activated += delegate(object sender, EventArgs e) { 
    Console.WriteLine("Handler 1!"); 
}; 
nsButton.Activated += delegate(object sender, EventArgs e) { 
    Console.WriteLine("Handler 2?"); 
}; 

(а затем эта кнопка добавляется к окну, конечно). Когда я нажимаю на него, я вижу «Обработчик 1!». но я не вижу «Обработчик 2»? появится в консоли. Если я прокомментирую строки, которые добавляют обработчик 1, тогда срабатывает обработчик 2.

Он ведет себя так, как если бы только первый добавленный делегат работал, а любые последующие игнорируются. Но это бросает вызов всему, что я могу найти о том, как должны работать события в C#. Что я делаю не так?

+0

Рассмотрим глядя на источник (предполагая, что вы можете получить один или использовать что-то вроде ILSpy декомпилировать) - в Servy (+1) ответ указывает, вы описали поведение по умолчанию, которые не нужных использовать управление. –

+0

Да, я искал источник для источника, но еще не нашел его. Я подозреваю, что это действительно что-то особенное для NSButton, потому что практически тот же самый код, подключенный к событию TouchUpInside от UIButton на iOS, отлично работает. –

+0

С некоторой помощью от Xamarin мне удалось обновить от MonoMac до Xamarin.Mac. Но это одно и то же. Все еще не удалось найти официальное слово или документацию о том, является ли это предполагаемым поведением. –

ответ

1

Стоит отметить, что вы описали, как события должны себя, не так, как они сусла ведут себя. Тип, определяющий событие, может игнорировать эти рекомендации, если он хочет, и не удерживать более одного обработчика. Это не то поведение, которое вы увидите почти во всех событиях, хотя они должны были бы сбиться с пути, чтобы создать такое поведение.